Commit dc44c45c authored by Lorenzo Bianconi's avatar Lorenzo Bianconi Committed by Felix Fietkau

mt76: introduce phys array in mt76_dev structure

Introduce phys array in mt76_dev structure to reference mt76_phy
supported by the chipset. This is a preliminary patch to introduce
newer chipset support.
Signed-off-by: default avatarLorenzo Bianconi <lorenzo@kernel.org>
Signed-off-by: default avatarFelix Fietkau <nbd@nbd.name>
parent 128c9b7d
...@@ -791,10 +791,15 @@ void mt76_dma_cleanup(struct mt76_dev *dev) ...@@ -791,10 +791,15 @@ void mt76_dma_cleanup(struct mt76_dev *dev)
mt76_worker_disable(&dev->tx_worker); mt76_worker_disable(&dev->tx_worker);
netif_napi_del(&dev->tx_napi); netif_napi_del(&dev->tx_napi);
for (i = 0; i < ARRAY_SIZE(dev->phy.q_tx); i++) { for (i = 0; i < ARRAY_SIZE(dev->phys); i++) {
mt76_dma_tx_cleanup(dev, dev->phy.q_tx[i], true); struct mt76_phy *phy = dev->phys[i];
if (dev->phy2) int j;
mt76_dma_tx_cleanup(dev, dev->phy2->q_tx[i], true);
if (!phy)
continue;
for (j = 0; j < ARRAY_SIZE(phy->q_tx); j++)
mt76_dma_tx_cleanup(dev, phy->q_tx[j], true);
} }
for (i = 0; i < ARRAY_SIZE(dev->q_mcu); i++) for (i = 0; i < ARRAY_SIZE(dev->q_mcu); i++)
......
...@@ -452,7 +452,7 @@ mt76_phy_init(struct mt76_phy *phy, struct ieee80211_hw *hw) ...@@ -452,7 +452,7 @@ mt76_phy_init(struct mt76_phy *phy, struct ieee80211_hw *hw)
struct mt76_phy * struct mt76_phy *
mt76_alloc_phy(struct mt76_dev *dev, unsigned int size, mt76_alloc_phy(struct mt76_dev *dev, unsigned int size,
const struct ieee80211_ops *ops) const struct ieee80211_ops *ops, u8 band_idx)
{ {
struct ieee80211_hw *hw; struct ieee80211_hw *hw;
unsigned int phy_size; unsigned int phy_size;
...@@ -467,6 +467,7 @@ mt76_alloc_phy(struct mt76_dev *dev, unsigned int size, ...@@ -467,6 +467,7 @@ mt76_alloc_phy(struct mt76_dev *dev, unsigned int size,
phy->dev = dev; phy->dev = dev;
phy->hw = hw; phy->hw = hw;
phy->priv = hw->priv + phy_size; phy->priv = hw->priv + phy_size;
phy->band_idx = band_idx;
hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN; hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN;
hw->wiphy->interface_modes = hw->wiphy->interface_modes =
...@@ -519,7 +520,7 @@ int mt76_register_phy(struct mt76_phy *phy, bool vht, ...@@ -519,7 +520,7 @@ int mt76_register_phy(struct mt76_phy *phy, bool vht,
if (ret) if (ret)
return ret; return ret;
phy->dev->phy2 = phy; phy->dev->phys[phy->band_idx] = phy;
return 0; return 0;
} }
...@@ -531,7 +532,7 @@ void mt76_unregister_phy(struct mt76_phy *phy) ...@@ -531,7 +532,7 @@ void mt76_unregister_phy(struct mt76_phy *phy)
mt76_tx_status_check(dev, true); mt76_tx_status_check(dev, true);
ieee80211_unregister_hw(phy->hw); ieee80211_unregister_hw(phy->hw);
dev->phy2 = NULL; dev->phys[phy->band_idx] = NULL;
} }
EXPORT_SYMBOL_GPL(mt76_unregister_phy); EXPORT_SYMBOL_GPL(mt76_unregister_phy);
...@@ -558,6 +559,8 @@ mt76_alloc_device(struct device *pdev, unsigned int size, ...@@ -558,6 +559,8 @@ mt76_alloc_device(struct device *pdev, unsigned int size,
phy = &dev->phy; phy = &dev->phy;
phy->dev = dev; phy->dev = dev;
phy->hw = hw; phy->hw = hw;
phy->band_idx = MT_BAND0;
dev->phys[phy->band_idx] = phy;
spin_lock_init(&dev->rx_lock); spin_lock_init(&dev->rx_lock);
spin_lock_init(&dev->lock); spin_lock_init(&dev->lock);
......
...@@ -107,6 +107,13 @@ enum mt76_rxq_id { ...@@ -107,6 +107,13 @@ enum mt76_rxq_id {
__MT_RXQ_MAX __MT_RXQ_MAX
}; };
enum mt76_band_id {
MT_BAND0,
MT_BAND1,
MT_BAND2,
__MT_MAX_BAND
};
enum mt76_cipher_type { enum mt76_cipher_type {
MT_CIPHER_NONE, MT_CIPHER_NONE,
MT_CIPHER_WEP40, MT_CIPHER_WEP40,
...@@ -661,6 +668,7 @@ struct mt76_phy { ...@@ -661,6 +668,7 @@ struct mt76_phy {
void *priv; void *priv;
unsigned long state; unsigned long state;
u8 band_idx;
struct mt76_queue *q_tx[__MT_TXQ_MAX]; struct mt76_queue *q_tx[__MT_TXQ_MAX];
...@@ -700,8 +708,7 @@ struct mt76_phy { ...@@ -700,8 +708,7 @@ 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 *phys[__MT_MAX_BAND];
struct mt76_phy *phy2;
struct ieee80211_hw *hw; struct ieee80211_hw *hw;
...@@ -891,7 +898,7 @@ mt76_wcid_hw(struct mt76_dev *dev, u16 wcid) ...@@ -891,7 +898,7 @@ mt76_wcid_hw(struct mt76_dev *dev, u16 wcid)
{ {
if (wcid <= MT76_N_WCIDS && if (wcid <= MT76_N_WCIDS &&
mt76_wcid_mask_test(dev->wcid_phy_mask, wcid)) mt76_wcid_mask_test(dev->wcid_phy_mask, wcid))
return dev->phy2->hw; return dev->phys[MT_BAND1]->hw;
return dev->phy.hw; return dev->phy.hw;
} }
...@@ -946,7 +953,8 @@ void mt76_free_device(struct mt76_dev *dev); ...@@ -946,7 +953,8 @@ void mt76_free_device(struct mt76_dev *dev);
void mt76_unregister_phy(struct mt76_phy *phy); void mt76_unregister_phy(struct mt76_phy *phy);
struct mt76_phy *mt76_alloc_phy(struct mt76_dev *dev, unsigned int size, struct mt76_phy *mt76_alloc_phy(struct mt76_dev *dev, unsigned int size,
const struct ieee80211_ops *ops); const struct ieee80211_ops *ops,
u8 band_idx);
int mt76_register_phy(struct mt76_phy *phy, bool vht, int mt76_register_phy(struct mt76_phy *phy, bool vht,
struct ieee80211_rate *rates, int n_rates); struct ieee80211_rate *rates, int n_rates);
...@@ -1000,8 +1008,9 @@ static inline int mt76_init_mcu_queue(struct mt76_dev *dev, int qid, int idx, ...@@ -1000,8 +1008,9 @@ static inline int mt76_init_mcu_queue(struct mt76_dev *dev, int qid, int idx,
static inline struct mt76_phy * static inline struct mt76_phy *
mt76_dev_phy(struct mt76_dev *dev, u8 phy_idx) mt76_dev_phy(struct mt76_dev *dev, u8 phy_idx)
{ {
if (phy_idx && dev->phy2) if ((phy_idx == MT_BAND1 && dev->phys[phy_idx]) ||
return dev->phy2; (phy_idx == MT_BAND2 && dev->phys[phy_idx]))
return dev->phys[phy_idx];
return &dev->phy; return &dev->phy;
} }
...@@ -1120,13 +1129,17 @@ static inline bool mt76_is_testmode_skb(struct mt76_dev *dev, ...@@ -1120,13 +1129,17 @@ static inline bool mt76_is_testmode_skb(struct mt76_dev *dev,
struct ieee80211_hw **hw) struct ieee80211_hw **hw)
{ {
#ifdef CONFIG_NL80211_TESTMODE #ifdef CONFIG_NL80211_TESTMODE
if (skb == dev->phy.test.tx_skb) int i;
*hw = dev->phy.hw;
else if (dev->phy2 && skb == dev->phy2->test.tx_skb) for (i = 0; i < ARRAY_SIZE(dev->phys); i++) {
*hw = dev->phy2->hw; struct mt76_phy *phy = dev->phys[i];
else
return false; if (phy && skb == phy->test.tx_skb) {
return true; *hw = dev->phys[i]->hw;
return true;
}
}
return false;
#else #else
return false; return false;
#endif #endif
...@@ -1244,8 +1257,8 @@ mt76_tx_status_get_hw(struct mt76_dev *dev, struct sk_buff *skb) ...@@ -1244,8 +1257,8 @@ mt76_tx_status_get_hw(struct mt76_dev *dev, struct sk_buff *skb)
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
struct ieee80211_hw *hw = dev->phy.hw; struct ieee80211_hw *hw = dev->phy.hw;
if ((info->hw_queue & MT_TX_HW_QUEUE_EXT_PHY) && dev->phy2) if ((info->hw_queue & MT_TX_HW_QUEUE_EXT_PHY) && dev->phys[MT_BAND1])
hw = dev->phy2->hw; hw = dev->phys[MT_BAND1]->hw;
info->hw_queue &= ~MT_TX_HW_QUEUE_EXT_PHY; info->hw_queue &= ~MT_TX_HW_QUEUE_EXT_PHY;
......
...@@ -459,7 +459,7 @@ int mt7615_register_ext_phy(struct mt7615_dev *dev) ...@@ -459,7 +459,7 @@ int mt7615_register_ext_phy(struct mt7615_dev *dev)
return 0; return 0;
mt7615_cap_dbdc_enable(dev); mt7615_cap_dbdc_enable(dev);
mphy = mt76_alloc_phy(&dev->mt76, sizeof(*phy), &mt7615_ops); mphy = mt76_alloc_phy(&dev->mt76, sizeof(*phy), &mt7615_ops, MT_BAND1);
if (!mphy) if (!mphy)
return -ENOMEM; return -ENOMEM;
...@@ -509,7 +509,7 @@ EXPORT_SYMBOL_GPL(mt7615_register_ext_phy); ...@@ -509,7 +509,7 @@ EXPORT_SYMBOL_GPL(mt7615_register_ext_phy);
void mt7615_unregister_ext_phy(struct mt7615_dev *dev) void mt7615_unregister_ext_phy(struct mt7615_dev *dev)
{ {
struct mt7615_phy *phy = mt7615_ext_phy(dev); struct mt7615_phy *phy = mt7615_ext_phy(dev);
struct mt76_phy *mphy = dev->mt76.phy2; struct mt76_phy *mphy = dev->mt76.phys[MT_BAND1];
if (!phy) if (!phy)
return; return;
......
...@@ -109,6 +109,7 @@ static struct mt76_wcid *mt7615_rx_get_wcid(struct mt7615_dev *dev, ...@@ -109,6 +109,7 @@ static struct mt76_wcid *mt7615_rx_get_wcid(struct mt7615_dev *dev,
void mt7615_mac_reset_counters(struct mt7615_dev *dev) void mt7615_mac_reset_counters(struct mt7615_dev *dev)
{ {
struct mt76_phy *mphy_ext = dev->mt76.phys[MT_BAND1];
int i; int i;
for (i = 0; i < 4; i++) { for (i = 0; i < 4; i++) {
...@@ -118,8 +119,8 @@ void mt7615_mac_reset_counters(struct mt7615_dev *dev) ...@@ -118,8 +119,8 @@ void mt7615_mac_reset_counters(struct mt7615_dev *dev)
memset(dev->mt76.aggr_stats, 0, sizeof(dev->mt76.aggr_stats)); memset(dev->mt76.aggr_stats, 0, sizeof(dev->mt76.aggr_stats));
dev->mt76.phy.survey_time = ktime_get_boottime(); dev->mt76.phy.survey_time = ktime_get_boottime();
if (dev->mt76.phy2) if (mphy_ext)
dev->mt76.phy2->survey_time = ktime_get_boottime(); mphy_ext->survey_time = ktime_get_boottime();
/* reset airtime counters */ /* reset airtime counters */
mt76_rr(dev, MT_MIB_SDR9(0)); mt76_rr(dev, MT_MIB_SDR9(0));
...@@ -336,9 +337,9 @@ static int mt7615_mac_fill_rx(struct mt7615_dev *dev, struct sk_buff *skb) ...@@ -336,9 +337,9 @@ static int mt7615_mac_fill_rx(struct mt7615_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 mt76_phy *mphy = &dev->mt76.phy; struct mt76_phy *mphy = &dev->mt76.phy;
struct mt7615_phy *phy = &dev->phy; struct mt7615_phy *phy = &dev->phy;
struct mt7615_phy *phy2 = dev->mt76.phy2 ? dev->mt76.phy2->priv : NULL;
struct ieee80211_supported_band *sband; struct ieee80211_supported_band *sband;
struct ieee80211_hdr *hdr; struct ieee80211_hdr *hdr;
struct mt7615_phy *phy2;
__le32 *rxd = (__le32 *)skb->data; __le32 *rxd = (__le32 *)skb->data;
u32 rxd0 = le32_to_cpu(rxd[0]); u32 rxd0 = le32_to_cpu(rxd[0]);
u32 rxd1 = le32_to_cpu(rxd[1]); u32 rxd1 = le32_to_cpu(rxd[1]);
...@@ -355,6 +356,8 @@ static int mt7615_mac_fill_rx(struct mt7615_dev *dev, struct sk_buff *skb) ...@@ -355,6 +356,8 @@ static int mt7615_mac_fill_rx(struct mt7615_dev *dev, struct sk_buff *skb)
memset(status, 0, sizeof(*status)); memset(status, 0, sizeof(*status));
chfreq = FIELD_GET(MT_RXD1_NORMAL_CH_FREQ, rxd1); chfreq = FIELD_GET(MT_RXD1_NORMAL_CH_FREQ, rxd1);
phy2 = dev->mt76.phys[MT_BAND1] ? dev->mt76.phys[MT_BAND1]->priv : NULL;
if (!phy2) if (!phy2)
phy_idx = 0; phy_idx = 0;
else if (phy2->chfreq == phy->chfreq) else if (phy2->chfreq == phy->chfreq)
...@@ -498,7 +501,7 @@ static int mt7615_mac_fill_rx(struct mt7615_dev *dev, struct sk_buff *skb) ...@@ -498,7 +501,7 @@ static int mt7615_mac_fill_rx(struct mt7615_dev *dev, struct sk_buff *skb)
} }
if (phy_idx == 1 && phy2) { if (phy_idx == 1 && phy2) {
mphy = dev->mt76.phy2; mphy = dev->mt76.phys[MT_BAND1];
phy = phy2; phy = phy2;
status->phy_idx = phy_idx; status->phy_idx = phy_idx;
} }
...@@ -747,8 +750,8 @@ int mt7615_mac_write_txwi(struct mt7615_dev *dev, __le32 *txwi, ...@@ -747,8 +750,8 @@ int mt7615_mac_write_txwi(struct mt7615_dev *dev, __le32 *txwi,
tx_count = msta->rate_count; tx_count = msta->rate_count;
} }
if (ext_phy && dev->mt76.phy2) if (ext_phy && dev->mt76.phys[MT_BAND1])
mphy = dev->mt76.phy2; mphy = dev->mt76.phys[MT_BAND1];
fc_type = (le16_to_cpu(fc) & IEEE80211_FCTL_FTYPE) >> 2; fc_type = (le16_to_cpu(fc) & IEEE80211_FCTL_FTYPE) >> 2;
fc_stype = (le16_to_cpu(fc) & IEEE80211_FCTL_STYPE) >> 4; fc_stype = (le16_to_cpu(fc) & IEEE80211_FCTL_STYPE) >> 4;
...@@ -1386,8 +1389,8 @@ static bool mt7615_fill_txs(struct mt7615_dev *dev, struct mt7615_sta *sta, ...@@ -1386,8 +1389,8 @@ static bool mt7615_fill_txs(struct mt7615_dev *dev, struct mt7615_sta *sta,
if (sta->rate_probe) { if (sta->rate_probe) {
struct mt7615_phy *phy = &dev->phy; struct mt7615_phy *phy = &dev->phy;
if (sta->wcid.ext_phy && dev->mt76.phy2) if (sta->wcid.ext_phy && dev->mt76.phys[MT_BAND1])
phy = dev->mt76.phy2->priv; phy = dev->mt76.phys[MT_BAND1]->priv;
mt7615_mac_set_rates(phy, sta, NULL, sta->rates); mt7615_mac_set_rates(phy, sta, NULL, sta->rates);
} }
...@@ -1429,8 +1432,8 @@ static bool mt7615_fill_txs(struct mt7615_dev *dev, struct mt7615_sta *sta, ...@@ -1429,8 +1432,8 @@ static bool mt7615_fill_txs(struct mt7615_dev *dev, struct mt7615_sta *sta,
fallthrough; fallthrough;
case MT_PHY_TYPE_OFDM: case MT_PHY_TYPE_OFDM:
mphy = &dev->mphy; mphy = &dev->mphy;
if (sta->wcid.ext_phy && dev->mt76.phy2) if (sta->wcid.ext_phy && dev->mt76.phys[MT_BAND1])
mphy = dev->mt76.phy2; mphy = dev->mt76.phys[MT_BAND1];
if (mphy->chandef.chan->band == NL80211_BAND_5GHZ) if (mphy->chandef.chan->band == NL80211_BAND_5GHZ)
sband = &mphy->sband_5g.sband; sband = &mphy->sband_5g.sband;
...@@ -1537,8 +1540,8 @@ static void mt7615_mac_add_txs(struct mt7615_dev *dev, void *data) ...@@ -1537,8 +1540,8 @@ static void mt7615_mac_add_txs(struct mt7615_dev *dev, void *data)
if (wcidx >= MT7615_WTBL_STA || !sta) if (wcidx >= MT7615_WTBL_STA || !sta)
goto out; goto out;
if (wcid->ext_phy && dev->mt76.phy2) if (wcid->ext_phy && dev->mt76.phys[MT_BAND1])
mphy = dev->mt76.phy2; mphy = dev->mt76.phys[MT_BAND1];
if (mt7615_fill_txs(dev, msta, &info, txs_data)) if (mt7615_fill_txs(dev, msta, &info, txs_data))
ieee80211_tx_status_noskb(mphy->hw, sta, &info); ieee80211_tx_status_noskb(mphy->hw, sta, &info);
...@@ -1955,6 +1958,7 @@ mt7615_phy_update_channel(struct mt76_phy *mphy, int idx) ...@@ -1955,6 +1958,7 @@ mt7615_phy_update_channel(struct mt76_phy *mphy, int idx)
static void mt7615_update_survey(struct mt7615_dev *dev) static void mt7615_update_survey(struct mt7615_dev *dev)
{ {
struct mt76_dev *mdev = &dev->mt76; struct mt76_dev *mdev = &dev->mt76;
struct mt76_phy *mphy_ext = mdev->phys[MT_BAND1];
ktime_t cur_time; ktime_t cur_time;
/* MT7615 can only update both phys simultaneously /* MT7615 can only update both phys simultaneously
...@@ -1962,14 +1966,14 @@ static void mt7615_update_survey(struct mt7615_dev *dev) ...@@ -1962,14 +1966,14 @@ static void mt7615_update_survey(struct mt7615_dev *dev)
*/ */
mt7615_phy_update_channel(&mdev->phy, 0); mt7615_phy_update_channel(&mdev->phy, 0);
if (mdev->phy2) if (mphy_ext)
mt7615_phy_update_channel(mdev->phy2, 1); mt7615_phy_update_channel(mphy_ext, 1);
cur_time = ktime_get_boottime(); cur_time = ktime_get_boottime();
mt76_update_survey_active_time(&mdev->phy, cur_time); mt76_update_survey_active_time(&mdev->phy, cur_time);
if (mdev->phy2) if (mphy_ext)
mt76_update_survey_active_time(mdev->phy2, cur_time); mt76_update_survey_active_time(mphy_ext, cur_time);
/* reset obss airtime */ /* reset obss airtime */
mt76_set(dev, MT_WF_RMAC_MIB_TIME0, MT_WF_RMAC_MIB_RXTIME_CLR); mt76_set(dev, MT_WF_RMAC_MIB_TIME0, MT_WF_RMAC_MIB_RXTIME_CLR);
......
...@@ -369,7 +369,7 @@ mt7615_mcu_rx_csa_notify(struct mt7615_dev *dev, struct sk_buff *skb) ...@@ -369,7 +369,7 @@ mt7615_mcu_rx_csa_notify(struct mt7615_dev *dev, struct sk_buff *skb)
return; return;
if (ext_phy && ext_phy->omac_mask & BIT_ULL(c->omac_idx)) if (ext_phy && ext_phy->omac_mask & BIT_ULL(c->omac_idx))
mphy = dev->mt76.phy2; mphy = dev->mt76.phys[MT_BAND1];
ieee80211_iterate_active_interfaces_atomic(mphy->hw, ieee80211_iterate_active_interfaces_atomic(mphy->hw,
IEEE80211_IFACE_ITER_RESUME_ALL, IEEE80211_IFACE_ITER_RESUME_ALL,
...@@ -388,8 +388,8 @@ mt7615_mcu_rx_radar_detected(struct mt7615_dev *dev, struct sk_buff *skb) ...@@ -388,8 +388,8 @@ mt7615_mcu_rx_radar_detected(struct mt7615_dev *dev, struct sk_buff *skb)
!r->constant_prf_detected && !r->staggered_prf_detected) !r->constant_prf_detected && !r->staggered_prf_detected)
return; return;
if (r->band_idx && dev->mt76.phy2) if (r->band_idx && dev->mt76.phys[MT_BAND1])
mphy = dev->mt76.phy2; mphy = dev->mt76.phys[MT_BAND1];
if (mt76_phy_dfs_state(mphy) < MT_DFS_STATE_CAC) if (mt76_phy_dfs_state(mphy) < MT_DFS_STATE_CAC)
return; return;
...@@ -448,8 +448,8 @@ mt7615_mcu_scan_event(struct mt7615_dev *dev, struct sk_buff *skb) ...@@ -448,8 +448,8 @@ mt7615_mcu_scan_event(struct mt7615_dev *dev, struct sk_buff *skb)
struct mt7615_phy *phy; struct mt7615_phy *phy;
struct mt76_phy *mphy; struct mt76_phy *mphy;
if (*seq_num & BIT(7) && dev->mt76.phy2) if (*seq_num & BIT(7) && dev->mt76.phys[MT_BAND1])
mphy = dev->mt76.phy2; mphy = dev->mt76.phys[MT_BAND1];
else else
mphy = &dev->mt76.phy; mphy = &dev->mt76.phy;
...@@ -474,8 +474,8 @@ mt7615_mcu_roc_event(struct mt7615_dev *dev, struct sk_buff *skb) ...@@ -474,8 +474,8 @@ mt7615_mcu_roc_event(struct mt7615_dev *dev, struct sk_buff *skb)
skb_pull(skb, sizeof(struct mt7615_mcu_rxd)); skb_pull(skb, sizeof(struct mt7615_mcu_rxd));
event = (struct mt7615_roc_tlv *)skb->data; event = (struct mt7615_roc_tlv *)skb->data;
if (event->dbdc_band && dev->mt76.phy2) if (event->dbdc_band && dev->mt76.phys[MT_BAND1])
mphy = dev->mt76.phy2; mphy = dev->mt76.phys[MT_BAND1];
else else
mphy = &dev->mt76.phy; mphy = &dev->mt76.phy;
...@@ -499,8 +499,8 @@ mt7615_mcu_beacon_loss_event(struct mt7615_dev *dev, struct sk_buff *skb) ...@@ -499,8 +499,8 @@ mt7615_mcu_beacon_loss_event(struct mt7615_dev *dev, struct sk_buff *skb)
skb_pull(skb, sizeof(struct mt7615_mcu_rxd)); skb_pull(skb, sizeof(struct mt7615_mcu_rxd));
event = (struct mt76_connac_beacon_loss_event *)skb->data; event = (struct mt76_connac_beacon_loss_event *)skb->data;
if (band_idx && dev->mt76.phy2) if (band_idx && dev->mt76.phys[MT_BAND1])
mphy = dev->mt76.phy2; mphy = dev->mt76.phys[MT_BAND1];
else else
mphy = &dev->mt76.phy; mphy = &dev->mt76.phy;
...@@ -520,8 +520,8 @@ mt7615_mcu_bss_event(struct mt7615_dev *dev, struct sk_buff *skb) ...@@ -520,8 +520,8 @@ mt7615_mcu_bss_event(struct mt7615_dev *dev, struct sk_buff *skb)
skb_pull(skb, sizeof(struct mt7615_mcu_rxd)); skb_pull(skb, sizeof(struct mt7615_mcu_rxd));
event = (struct mt76_connac_mcu_bss_event *)skb->data; event = (struct mt76_connac_mcu_bss_event *)skb->data;
if (band_idx && dev->mt76.phy2) if (band_idx && dev->mt76.phys[MT_BAND1])
mphy = dev->mt76.phy2; mphy = dev->mt76.phys[MT_BAND1];
else else
mphy = &dev->mt76.phy; mphy = &dev->mt76.phy;
...@@ -2330,7 +2330,7 @@ int mt7615_mcu_apply_rx_dcoc(struct mt7615_phy *phy) ...@@ -2330,7 +2330,7 @@ int mt7615_mcu_apply_rx_dcoc(struct mt7615_phy *phy)
.bw = mt7615_mcu_chan_bw(chandef), .bw = mt7615_mcu_chan_bw(chandef),
.band = chandef->center_freq1 > 4000, .band = chandef->center_freq1 > 4000,
.dbdc_en = !!dev->mt76.phy2, .dbdc_en = !!dev->mt76.phys[MT_BAND1],
}; };
u16 center_freq = chandef->center_freq1; u16 center_freq = chandef->center_freq1;
int freq_idx; int freq_idx;
...@@ -2451,7 +2451,7 @@ int mt7615_mcu_apply_tx_dpd(struct mt7615_phy *phy) ...@@ -2451,7 +2451,7 @@ int mt7615_mcu_apply_tx_dpd(struct mt7615_phy *phy)
.bw = mt7615_mcu_chan_bw(chandef), .bw = mt7615_mcu_chan_bw(chandef),
.band = chandef->center_freq1 > 4000, .band = chandef->center_freq1 > 4000,
.dbdc_en = !!dev->mt76.phy2, .dbdc_en = !!dev->mt76.phys[MT_BAND1],
}; };
u16 center_freq = chandef->center_freq1; u16 center_freq = chandef->center_freq1;
int freq_idx; int freq_idx;
......
...@@ -345,7 +345,7 @@ mt7615_hw_dev(struct ieee80211_hw *hw) ...@@ -345,7 +345,7 @@ mt7615_hw_dev(struct ieee80211_hw *hw)
static inline struct mt7615_phy * static inline struct mt7615_phy *
mt7615_ext_phy(struct mt7615_dev *dev) mt7615_ext_phy(struct mt7615_dev *dev)
{ {
struct mt76_phy *phy = dev->mt76.phy2; struct mt76_phy *phy = dev->mt76.phys[MT_BAND1];
if (!phy) if (!phy)
return NULL; return NULL;
......
...@@ -78,8 +78,8 @@ int mt7615_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr, ...@@ -78,8 +78,8 @@ int mt7615_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr,
if ((info->flags & IEEE80211_TX_CTL_RATE_CTRL_PROBE) && msta) { if ((info->flags & IEEE80211_TX_CTL_RATE_CTRL_PROBE) && msta) {
struct mt7615_phy *phy = &dev->phy; struct mt7615_phy *phy = &dev->phy;
if ((info->hw_queue & MT_TX_HW_QUEUE_EXT_PHY) && mdev->phy2) if ((info->hw_queue & MT_TX_HW_QUEUE_EXT_PHY) && mdev->phys[MT_BAND1])
phy = mdev->phy2->priv; phy = mdev->phys[MT_BAND1]->priv;
spin_lock_bh(&dev->mt76.lock); spin_lock_bh(&dev->mt76.lock);
mt7615_mac_set_rates(phy, msta, &info->control.rates[0], mt7615_mac_set_rates(phy, msta, &info->control.rates[0],
...@@ -182,16 +182,18 @@ mt7615_update_vif_beacon(void *priv, u8 *mac, struct ieee80211_vif *vif) ...@@ -182,16 +182,18 @@ mt7615_update_vif_beacon(void *priv, u8 *mac, struct ieee80211_vif *vif)
static void static void
mt7615_update_beacons(struct mt7615_dev *dev) mt7615_update_beacons(struct mt7615_dev *dev)
{ {
struct mt76_phy *mphy_ext = dev->mt76.phys[MT_BAND1];
ieee80211_iterate_active_interfaces(dev->mt76.hw, ieee80211_iterate_active_interfaces(dev->mt76.hw,
IEEE80211_IFACE_ITER_RESUME_ALL, IEEE80211_IFACE_ITER_RESUME_ALL,
mt7615_update_vif_beacon, dev->mt76.hw); mt7615_update_vif_beacon, dev->mt76.hw);
if (!dev->mt76.phy2) if (!mphy_ext)
return; return;
ieee80211_iterate_active_interfaces(dev->mt76.phy2->hw, ieee80211_iterate_active_interfaces(mphy_ext->hw,
IEEE80211_IFACE_ITER_RESUME_ALL, IEEE80211_IFACE_ITER_RESUME_ALL,
mt7615_update_vif_beacon, dev->mt76.phy2->hw); mt7615_update_vif_beacon, mphy_ext->hw);
} }
void mt7615_mac_reset_work(struct work_struct *work) void mt7615_mac_reset_work(struct work_struct *work)
...@@ -203,7 +205,7 @@ void mt7615_mac_reset_work(struct work_struct *work) ...@@ -203,7 +205,7 @@ void mt7615_mac_reset_work(struct work_struct *work)
int i; int i;
dev = container_of(work, struct mt7615_dev, reset_work); dev = container_of(work, struct mt7615_dev, reset_work);
ext_phy = dev->mt76.phy2; ext_phy = dev->mt76.phys[MT_BAND1];
phy2 = ext_phy ? ext_phy->priv : NULL; phy2 = ext_phy ? ext_phy->priv : NULL;
if (!(READ_ONCE(dev->reset_state) & MT_MCU_CMD_STOP_PDMA)) if (!(READ_ONCE(dev->reset_state) & MT_MCU_CMD_STOP_PDMA))
......
...@@ -474,8 +474,8 @@ void mt76_connac2_mac_write_txwi(struct mt76_dev *dev, __le32 *txwi, ...@@ -474,8 +474,8 @@ void mt76_connac2_mac_write_txwi(struct mt76_dev *dev, __le32 *txwi,
band_idx = mvif->band_idx; band_idx = mvif->band_idx;
} }
if (ext_phy && dev->phy2) if (ext_phy && dev->phys[MT_BAND1])
mphy = dev->phy2; mphy = dev->phys[MT_BAND1];
if (inband_disc) { if (inband_disc) {
p_fmt = MT_TX_TYPE_FW; p_fmt = MT_TX_TYPE_FW;
...@@ -597,8 +597,8 @@ bool mt76_connac2_mac_add_txs_skb(struct mt76_dev *dev, struct mt76_wcid *wcid, ...@@ -597,8 +597,8 @@ bool mt76_connac2_mac_add_txs_skb(struct mt76_dev *dev, struct mt76_wcid *wcid,
fallthrough; fallthrough;
case MT_PHY_TYPE_OFDM: case MT_PHY_TYPE_OFDM:
mphy = &dev->phy; mphy = &dev->phy;
if (wcid->ext_phy && dev->phy2) if (wcid->ext_phy && dev->phys[MT_BAND1])
mphy = dev->phy2; mphy = dev->phys[MT_BAND1];
if (mphy->chandef.chan->band == NL80211_BAND_5GHZ) if (mphy->chandef.chan->band == NL80211_BAND_5GHZ)
sband = &mphy->sband_5g.sband; sband = &mphy->sband_5g.sband;
......
...@@ -504,7 +504,7 @@ mt7915_alloc_ext_phy(struct mt7915_dev *dev) ...@@ -504,7 +504,7 @@ mt7915_alloc_ext_phy(struct mt7915_dev *dev)
if (!dev->dbdc_support) if (!dev->dbdc_support)
return NULL; return NULL;
mphy = mt76_alloc_phy(&dev->mt76, sizeof(*phy), &mt7915_ops); mphy = mt76_alloc_phy(&dev->mt76, sizeof(*phy), &mt7915_ops, MT_BAND1);
if (!mphy) if (!mphy)
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
...@@ -1038,7 +1038,7 @@ void mt7915_set_stream_he_caps(struct mt7915_phy *phy) ...@@ -1038,7 +1038,7 @@ void mt7915_set_stream_he_caps(struct mt7915_phy *phy)
static void mt7915_unregister_ext_phy(struct mt7915_dev *dev) static void mt7915_unregister_ext_phy(struct mt7915_dev *dev)
{ {
struct mt7915_phy *phy = mt7915_ext_phy(dev); struct mt7915_phy *phy = mt7915_ext_phy(dev);
struct mt76_phy *mphy = dev->mt76.phy2; struct mt76_phy *mphy = dev->mt76.phys[MT_BAND1];
if (!phy) if (!phy)
return; return;
......
...@@ -242,7 +242,7 @@ mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb) ...@@ -242,7 +242,7 @@ mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)
memset(status, 0, sizeof(*status)); memset(status, 0, sizeof(*status));
if ((rxd1 & MT_RXD1_NORMAL_BAND_IDX) && !phy->band_idx) { if ((rxd1 & MT_RXD1_NORMAL_BAND_IDX) && !phy->band_idx) {
mphy = dev->mt76.phy2; mphy = dev->mt76.phys[MT_BAND1];
if (!mphy) if (!mphy)
return -EINVAL; return -EINVAL;
...@@ -668,8 +668,8 @@ void mt7915_mac_write_txwi(struct mt76_dev *dev, __le32 *txwi, ...@@ -668,8 +668,8 @@ void mt7915_mac_write_txwi(struct mt76_dev *dev, __le32 *txwi,
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
struct mt76_phy *mphy = &dev->phy; struct mt76_phy *mphy = &dev->phy;
if ((info->hw_queue & MT_TX_HW_QUEUE_EXT_PHY) && dev->phy2) if ((info->hw_queue & MT_TX_HW_QUEUE_EXT_PHY) && dev->phys[MT_BAND1])
mphy = dev->phy2; mphy = dev->phys[MT_BAND1];
mt76_connac2_mac_write_txwi(dev, txwi, skb, wcid, key, pid, qid, changed); mt76_connac2_mac_write_txwi(dev, txwi, skb, wcid, key, pid, qid, changed);
...@@ -853,7 +853,7 @@ static void ...@@ -853,7 +853,7 @@ static void
mt7915_mac_tx_free_prepare(struct mt7915_dev *dev) mt7915_mac_tx_free_prepare(struct mt7915_dev *dev)
{ {
struct mt76_dev *mdev = &dev->mt76; struct mt76_dev *mdev = &dev->mt76;
struct mt76_phy *mphy_ext = mdev->phy2; struct mt76_phy *mphy_ext = mdev->phys[MT_BAND1];
/* clean DMA queues and unmap buffers first */ /* clean DMA queues and unmap buffers first */
mt76_queue_tx_cleanup(dev, dev->mphy.q_tx[MT_TXQ_PSD], false); mt76_queue_tx_cleanup(dev, dev->mphy.q_tx[MT_TXQ_PSD], false);
...@@ -1275,22 +1275,24 @@ mt7915_update_vif_beacon(void *priv, u8 *mac, struct ieee80211_vif *vif) ...@@ -1275,22 +1275,24 @@ mt7915_update_vif_beacon(void *priv, u8 *mac, struct ieee80211_vif *vif)
static void static void
mt7915_update_beacons(struct mt7915_dev *dev) mt7915_update_beacons(struct mt7915_dev *dev)
{ {
struct mt76_phy *mphy_ext = dev->mt76.phys[MT_BAND1];
ieee80211_iterate_active_interfaces(dev->mt76.hw, ieee80211_iterate_active_interfaces(dev->mt76.hw,
IEEE80211_IFACE_ITER_RESUME_ALL, IEEE80211_IFACE_ITER_RESUME_ALL,
mt7915_update_vif_beacon, dev->mt76.hw); mt7915_update_vif_beacon, dev->mt76.hw);
if (!dev->mt76.phy2) if (!mphy_ext)
return; return;
ieee80211_iterate_active_interfaces(dev->mt76.phy2->hw, ieee80211_iterate_active_interfaces(mphy_ext->hw,
IEEE80211_IFACE_ITER_RESUME_ALL, IEEE80211_IFACE_ITER_RESUME_ALL,
mt7915_update_vif_beacon, dev->mt76.phy2->hw); mt7915_update_vif_beacon, mphy_ext->hw);
} }
static void static void
mt7915_dma_reset(struct mt7915_dev *dev) mt7915_dma_reset(struct mt7915_dev *dev)
{ {
struct mt76_phy *mphy_ext = dev->mt76.phy2; struct mt76_phy *mphy_ext = dev->mt76.phys[MT_BAND1];
u32 hif1_ofs = MT_WFDMA0_PCIE1(0) - MT_WFDMA0(0); u32 hif1_ofs = MT_WFDMA0_PCIE1(0) - MT_WFDMA0(0);
int i; int i;
...@@ -1377,7 +1379,7 @@ void mt7915_mac_reset_work(struct work_struct *work) ...@@ -1377,7 +1379,7 @@ void mt7915_mac_reset_work(struct work_struct *work)
int i; int i;
dev = container_of(work, struct mt7915_dev, reset_work); dev = container_of(work, struct mt7915_dev, reset_work);
ext_phy = dev->mt76.phy2; ext_phy = dev->mt76.phys[MT_BAND1];
phy2 = ext_phy ? ext_phy->priv : NULL; phy2 = ext_phy ? ext_phy->priv : NULL;
if (!(READ_ONCE(dev->reset_state) & MT_MCU_CMD_STOP_DMA)) if (!(READ_ONCE(dev->reset_state) & MT_MCU_CMD_STOP_DMA))
......
...@@ -228,8 +228,8 @@ mt7915_mcu_rx_csa_notify(struct mt7915_dev *dev, struct sk_buff *skb) ...@@ -228,8 +228,8 @@ mt7915_mcu_rx_csa_notify(struct mt7915_dev *dev, struct sk_buff *skb)
c = (struct mt7915_mcu_csa_notify *)skb->data; c = (struct mt7915_mcu_csa_notify *)skb->data;
if ((c->band_idx && !dev->phy.band_idx) && dev->mt76.phy2) if ((c->band_idx && !dev->phy.band_idx) && dev->mt76.phys[MT_BAND1])
mphy = dev->mt76.phy2; mphy = dev->mt76.phys[MT_BAND1];
ieee80211_iterate_active_interfaces_atomic(mphy->hw, ieee80211_iterate_active_interfaces_atomic(mphy->hw,
IEEE80211_IFACE_ITER_RESUME_ALL, IEEE80211_IFACE_ITER_RESUME_ALL,
...@@ -247,8 +247,8 @@ mt7915_mcu_rx_thermal_notify(struct mt7915_dev *dev, struct sk_buff *skb) ...@@ -247,8 +247,8 @@ mt7915_mcu_rx_thermal_notify(struct mt7915_dev *dev, struct sk_buff *skb)
if (t->ctrl.ctrl_id != THERMAL_PROTECT_ENABLE) if (t->ctrl.ctrl_id != THERMAL_PROTECT_ENABLE)
return; return;
if ((t->ctrl.band_idx && !dev->phy.band_idx) && dev->mt76.phy2) if ((t->ctrl.band_idx && !dev->phy.band_idx) && dev->mt76.phys[MT_BAND1])
mphy = dev->mt76.phy2; mphy = dev->mt76.phys[MT_BAND1];
phy = (struct mt7915_phy *)mphy->priv; phy = (struct mt7915_phy *)mphy->priv;
phy->throttle_state = t->ctrl.duty.duty_cycle; phy->throttle_state = t->ctrl.duty.duty_cycle;
...@@ -262,8 +262,8 @@ mt7915_mcu_rx_radar_detected(struct mt7915_dev *dev, struct sk_buff *skb) ...@@ -262,8 +262,8 @@ mt7915_mcu_rx_radar_detected(struct mt7915_dev *dev, struct sk_buff *skb)
r = (struct mt7915_mcu_rdd_report *)skb->data; r = (struct mt7915_mcu_rdd_report *)skb->data;
if ((r->band_idx && !dev->phy.band_idx) && dev->mt76.phy2) if ((r->band_idx && !dev->phy.band_idx) && dev->mt76.phys[MT_BAND1])
mphy = dev->mt76.phy2; mphy = dev->mt76.phys[MT_BAND1];
if (r->band_idx == MT_RX_SEL2) if (r->band_idx == MT_RX_SEL2)
cfg80211_background_radar_event(mphy->hw->wiphy, cfg80211_background_radar_event(mphy->hw->wiphy,
...@@ -319,8 +319,8 @@ mt7915_mcu_rx_bcc_notify(struct mt7915_dev *dev, struct sk_buff *skb) ...@@ -319,8 +319,8 @@ mt7915_mcu_rx_bcc_notify(struct mt7915_dev *dev, struct sk_buff *skb)
b = (struct mt7915_mcu_bcc_notify *)skb->data; b = (struct mt7915_mcu_bcc_notify *)skb->data;
if ((b->band_idx && !dev->phy.band_idx) && dev->mt76.phy2) if ((b->band_idx && !dev->phy.band_idx) && dev->mt76.phys[MT_BAND1])
mphy = dev->mt76.phy2; mphy = dev->mt76.phys[MT_BAND1];
ieee80211_iterate_active_interfaces_atomic(mphy->hw, ieee80211_iterate_active_interfaces_atomic(mphy->hw,
IEEE80211_IFACE_ITER_RESUME_ALL, IEEE80211_IFACE_ITER_RESUME_ALL,
......
...@@ -388,7 +388,7 @@ mt7915_hw_dev(struct ieee80211_hw *hw) ...@@ -388,7 +388,7 @@ mt7915_hw_dev(struct ieee80211_hw *hw)
static inline struct mt7915_phy * static inline struct mt7915_phy *
mt7915_ext_phy(struct mt7915_dev *dev) mt7915_ext_phy(struct mt7915_dev *dev)
{ {
struct mt76_phy *phy = dev->mt76.phy2; struct mt76_phy *phy = dev->mt76.phys[MT_BAND1];
if (!phy) if (!phy)
return NULL; return NULL;
......
...@@ -585,15 +585,25 @@ EXPORT_SYMBOL_GPL(mt76_txq_schedule_all); ...@@ -585,15 +585,25 @@ EXPORT_SYMBOL_GPL(mt76_txq_schedule_all);
void mt76_tx_worker_run(struct mt76_dev *dev) void mt76_tx_worker_run(struct mt76_dev *dev)
{ {
mt76_txq_schedule_all(&dev->phy); struct mt76_phy *phy;
if (dev->phy2) int i;
mt76_txq_schedule_all(dev->phy2);
for (i = 0; i < ARRAY_SIZE(dev->phys); i++) {
phy = dev->phys[i];
if (!phy)
continue;
mt76_txq_schedule_all(phy);
}
#ifdef CONFIG_NL80211_TESTMODE #ifdef CONFIG_NL80211_TESTMODE
if (dev->phy.test.tx_pending) for (i = 0; i < ARRAY_SIZE(dev->phys); i++) {
mt76_testmode_tx_pending(&dev->phy); phy = dev->phys[i];
if (dev->phy2 && dev->phy2->test.tx_pending) if (!phy || !phy->test.tx_pending)
mt76_testmode_tx_pending(dev->phy2); continue;
mt76_testmode_tx_pending(phy);
}
#endif #endif
} }
EXPORT_SYMBOL_GPL(mt76_tx_worker_run); EXPORT_SYMBOL_GPL(mt76_tx_worker_run);
...@@ -696,17 +706,23 @@ EXPORT_SYMBOL_GPL(mt76_queue_tx_complete); ...@@ -696,17 +706,23 @@ EXPORT_SYMBOL_GPL(mt76_queue_tx_complete);
void __mt76_set_tx_blocked(struct mt76_dev *dev, bool blocked) void __mt76_set_tx_blocked(struct mt76_dev *dev, bool blocked)
{ {
struct mt76_phy *phy = &dev->phy, *phy2 = dev->phy2; struct mt76_phy *phy = &dev->phy;
struct mt76_queue *q, *q2 = NULL; struct mt76_queue *q = phy->q_tx[0];
q = phy->q_tx[0];
if (blocked == q->blocked) if (blocked == q->blocked)
return; return;
q->blocked = blocked; q->blocked = blocked;
if (phy2) {
q2 = phy2->q_tx[0]; phy = dev->phys[MT_BAND1];
q2->blocked = blocked; if (phy) {
q = phy->q_tx[0];
q->blocked = blocked;
}
phy = dev->phys[MT_BAND2];
if (phy) {
q = phy->q_tx[0];
q->blocked = blocked;
} }
if (!blocked) if (!blocked)
......
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