Commit 006b9d4a authored by Bo Jiao's avatar Bo Jiao Committed by Felix Fietkau

mt76: mt7915: introduce band_idx in mt7915_phy

The wfsys of MT7986 has only single adie chip for non-dbdc devices,
and it binds to band1 by default. Hence this patch adds band_idx to
explicitly configure phy accordingly.
Co-developed-by: default avatarSujuan Chen <sujuan.chen@mediatek.com>
Signed-off-by: default avatarSujuan Chen <sujuan.chen@mediatek.com>
Co-developed-by: default avatarShayne Chen <shayne.chen@mediatek.com>
Signed-off-by: default avatarShayne Chen <shayne.chen@mediatek.com>
Signed-off-by: default avatarBo Jiao <Bo.Jiao@mediatek.com>
Reviewed-by: default avatarRyder Lee <ryder.lee@mediatek.com>
Signed-off-by: default avatarBo Jiao <Bo.Jiao@mediatek.com>
Signed-off-by: default avatarFelix Fietkau <nbd@nbd.name>
parent 99ad32a4
...@@ -1501,7 +1501,6 @@ int mt76_connac_mcu_hw_scan(struct mt76_phy *phy, struct ieee80211_vif *vif, ...@@ -1501,7 +1501,6 @@ int mt76_connac_mcu_hw_scan(struct mt76_phy *phy, struct ieee80211_vif *vif,
int ext_channels_num = max_t(int, sreq->n_channels - 32, 0); int ext_channels_num = max_t(int, sreq->n_channels - 32, 0);
struct ieee80211_channel **scan_list = sreq->channels; struct ieee80211_channel **scan_list = sreq->channels;
struct mt76_dev *mdev = phy->dev; struct mt76_dev *mdev = phy->dev;
bool ext_phy = phy == mdev->phy2;
struct mt76_connac_mcu_scan_channel *chan; struct mt76_connac_mcu_scan_channel *chan;
struct mt76_connac_hw_scan_req *req; struct mt76_connac_hw_scan_req *req;
struct sk_buff *skb; struct sk_buff *skb;
...@@ -1515,7 +1514,7 @@ int mt76_connac_mcu_hw_scan(struct mt76_phy *phy, struct ieee80211_vif *vif, ...@@ -1515,7 +1514,7 @@ int mt76_connac_mcu_hw_scan(struct mt76_phy *phy, struct ieee80211_vif *vif,
req = (struct mt76_connac_hw_scan_req *)skb_put(skb, sizeof(*req)); req = (struct mt76_connac_hw_scan_req *)skb_put(skb, sizeof(*req));
req->seq_num = mvif->scan_seq_num | ext_phy << 7; req->seq_num = mvif->scan_seq_num | mvif->band_idx << 7;
req->bss_idx = mvif->idx; req->bss_idx = mvif->idx;
req->scan_type = sreq->n_ssids ? 1 : 0; req->scan_type = sreq->n_ssids ? 1 : 0;
req->probe_req_num = sreq->n_ssids ? 2 : 0; req->probe_req_num = sreq->n_ssids ? 2 : 0;
...@@ -1623,7 +1622,6 @@ int mt76_connac_mcu_sched_scan_req(struct mt76_phy *phy, ...@@ -1623,7 +1622,6 @@ int mt76_connac_mcu_sched_scan_req(struct mt76_phy *phy,
struct mt76_connac_mcu_scan_channel *chan; struct mt76_connac_mcu_scan_channel *chan;
struct mt76_connac_sched_scan_req *req; struct mt76_connac_sched_scan_req *req;
struct mt76_dev *mdev = phy->dev; struct mt76_dev *mdev = phy->dev;
bool ext_phy = phy == mdev->phy2;
struct cfg80211_match_set *match; struct cfg80211_match_set *match;
struct cfg80211_ssid *ssid; struct cfg80211_ssid *ssid;
struct sk_buff *skb; struct sk_buff *skb;
...@@ -1637,7 +1635,7 @@ int mt76_connac_mcu_sched_scan_req(struct mt76_phy *phy, ...@@ -1637,7 +1635,7 @@ int mt76_connac_mcu_sched_scan_req(struct mt76_phy *phy,
req = (struct mt76_connac_sched_scan_req *)skb_put(skb, sizeof(*req)); req = (struct mt76_connac_sched_scan_req *)skb_put(skb, sizeof(*req));
req->version = 1; req->version = 1;
req->seq_num = mvif->scan_seq_num | ext_phy << 7; req->seq_num = mvif->scan_seq_num | mvif->band_idx << 7;
if (sreq->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) { if (sreq->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) {
u8 *addr = is_mt7663(phy->dev) ? req->mt7663.random_mac u8 *addr = is_mt7663(phy->dev) ? req->mt7663.random_mac
......
...@@ -548,12 +548,12 @@ mt7915_ampdu_stat_read_phy(struct mt7915_phy *phy, ...@@ -548,12 +548,12 @@ mt7915_ampdu_stat_read_phy(struct mt7915_phy *phy,
/* Tx ampdu stat */ /* Tx ampdu stat */
for (i = 0; i < ARRAY_SIZE(range); i++) for (i = 0; i < ARRAY_SIZE(range); i++)
range[i] = mt76_rr(dev, MT_MIB_ARNG(ext_phy, i)); range[i] = mt76_rr(dev, MT_MIB_ARNG(phy->band_idx, i));
for (i = 0; i < ARRAY_SIZE(bound); i++) for (i = 0; i < ARRAY_SIZE(bound); i++)
bound[i] = MT_MIB_ARNCR_RANGE(range[i / 4], i % 4) + 1; bound[i] = MT_MIB_ARNCR_RANGE(range[i / 4], i % 4) + 1;
seq_printf(file, "\nPhy %d\n", ext_phy); seq_printf(file, "\nPhy %d, Phy band %d\n", ext_phy, phy->band_idx);
seq_printf(file, "Length: %8d | ", bound[0]); seq_printf(file, "Length: %8d | ", bound[0]);
for (i = 0; i < ARRAY_SIZE(bound) - 1; i++) for (i = 0; i < ARRAY_SIZE(bound) - 1; i++)
...@@ -561,7 +561,7 @@ mt7915_ampdu_stat_read_phy(struct mt7915_phy *phy, ...@@ -561,7 +561,7 @@ mt7915_ampdu_stat_read_phy(struct mt7915_phy *phy,
bound[i] + 1, bound[i + 1]); bound[i] + 1, bound[i + 1]);
seq_puts(file, "\nCount: "); seq_puts(file, "\nCount: ");
n = ext_phy ? ARRAY_SIZE(dev->mt76.aggr_stats) / 2 : 0; n = phy->band_idx ? ARRAY_SIZE(dev->mt76.aggr_stats) / 2 : 0;
for (i = 0; i < ARRAY_SIZE(bound); i++) for (i = 0; i < ARRAY_SIZE(bound); i++)
seq_printf(file, "%8d | ", dev->mt76.aggr_stats[i + n]); seq_printf(file, "%8d | ", dev->mt76.aggr_stats[i + n]);
seq_puts(file, "\n"); seq_puts(file, "\n");
...@@ -898,7 +898,7 @@ int mt7915_init_debugfs(struct mt7915_phy *phy) ...@@ -898,7 +898,7 @@ int mt7915_init_debugfs(struct mt7915_phy *phy)
debugfs_create_devm_seqfile(dev->mt76.dev, "twt_stats", dir, debugfs_create_devm_seqfile(dev->mt76.dev, "twt_stats", dir,
mt7915_twt_stats); mt7915_twt_stats);
debugfs_create_file("ser_trigger", 0200, dir, dev, &fops_ser_trigger); debugfs_create_file("ser_trigger", 0200, dir, dev, &fops_ser_trigger);
if (!dev->dbdc_support || ext_phy) { if (!dev->dbdc_support || phy->band_idx) {
debugfs_create_u32("dfs_hw_pattern", 0400, dir, debugfs_create_u32("dfs_hw_pattern", 0400, dir,
&dev->hw_pattern); &dev->hw_pattern);
debugfs_create_file("radar_trigger", 0200, dir, dev, debugfs_create_file("radar_trigger", 0200, dir, dev,
......
...@@ -310,10 +310,12 @@ static int mt7915_dma_enable(struct mt7915_dev *dev) ...@@ -310,10 +310,12 @@ static int mt7915_dma_enable(struct mt7915_dev *dev)
/* enable interrupts for TX/RX rings */ /* enable interrupts for TX/RX rings */
irq_mask = MT_INT_RX_DONE_MCU | irq_mask = MT_INT_RX_DONE_MCU |
MT_INT_TX_DONE_MCU | MT_INT_TX_DONE_MCU |
MT_INT_MCU_CMD | MT_INT_MCU_CMD;
MT_INT_BAND0_RX_DONE;
if (dev->dbdc_support) if (!dev->phy.band_idx)
irq_mask |= MT_INT_BAND0_RX_DONE;
if (dev->dbdc_support || dev->phy.band_idx)
irq_mask |= MT_INT_BAND1_RX_DONE; irq_mask |= MT_INT_BAND1_RX_DONE;
mt7915_irq_enable(dev, irq_mask); mt7915_irq_enable(dev, irq_mask);
...@@ -338,7 +340,7 @@ int mt7915_dma_init(struct mt7915_dev *dev) ...@@ -338,7 +340,7 @@ int mt7915_dma_init(struct mt7915_dev *dev)
/* init tx queue */ /* init tx queue */
ret = mt7915_init_tx_queues(&dev->phy, ret = mt7915_init_tx_queues(&dev->phy,
MT_TXQ_ID(0), MT_TXQ_ID(dev->phy.band_idx),
MT7915_TX_RING_SIZE, MT7915_TX_RING_SIZE,
MT_TXQ_RING_BASE(0)); MT_TXQ_RING_BASE(0));
if (ret) if (ret)
...@@ -387,13 +389,15 @@ int mt7915_dma_init(struct mt7915_dev *dev) ...@@ -387,13 +389,15 @@ int mt7915_dma_init(struct mt7915_dev *dev)
return ret; return ret;
/* rx data queue for band0 */ /* rx data queue for band0 */
ret = mt76_queue_alloc(dev, &dev->mt76.q_rx[MT_RXQ_MAIN], if (!dev->phy.band_idx) {
MT_RXQ_ID(MT_RXQ_MAIN), ret = mt76_queue_alloc(dev, &dev->mt76.q_rx[MT_RXQ_MAIN],
MT7915_RX_RING_SIZE, MT_RXQ_ID(MT_RXQ_MAIN),
MT_RX_BUF_SIZE, MT7915_RX_RING_SIZE,
MT_RXQ_RING_BASE(MT_RXQ_MAIN)); MT_RX_BUF_SIZE,
if (ret) MT_RXQ_RING_BASE(MT_RXQ_MAIN));
return ret; if (ret)
return ret;
}
/* tx free notify event from WA for band0 */ /* tx free notify event from WA for band0 */
if (!is_mt7915(mdev)) { if (!is_mt7915(mdev)) {
...@@ -406,7 +410,7 @@ int mt7915_dma_init(struct mt7915_dev *dev) ...@@ -406,7 +410,7 @@ int mt7915_dma_init(struct mt7915_dev *dev)
return ret; return ret;
} }
if (dev->dbdc_support) { if (dev->dbdc_support || dev->phy.band_idx) {
/* rx data queue for band1 */ /* rx data queue for band1 */
ret = mt76_queue_alloc(dev, &dev->mt76.q_rx[MT_RXQ_EXT], ret = mt76_queue_alloc(dev, &dev->mt76.q_rx[MT_RXQ_EXT],
MT_RXQ_ID(MT_RXQ_EXT), MT_RXQ_ID(MT_RXQ_EXT),
......
...@@ -130,14 +130,14 @@ static int mt7915_eeprom_load(struct mt7915_dev *dev) ...@@ -130,14 +130,14 @@ static int mt7915_eeprom_load(struct mt7915_dev *dev)
static void mt7915_eeprom_parse_band_config(struct mt7915_phy *phy) static void mt7915_eeprom_parse_band_config(struct mt7915_phy *phy)
{ {
struct mt7915_dev *dev = phy->dev; struct mt7915_dev *dev = phy->dev;
bool ext_phy = phy != &dev->phy;
u8 *eeprom = dev->mt76.eeprom.data; u8 *eeprom = dev->mt76.eeprom.data;
u32 val; u32 val;
val = eeprom[MT_EE_WIFI_CONF + ext_phy]; val = eeprom[MT_EE_WIFI_CONF + phy->band_idx];
val = FIELD_GET(MT_EE_WIFI_CONF0_BAND_SEL, val); val = FIELD_GET(MT_EE_WIFI_CONF0_BAND_SEL, val);
if (val == MT_EE_BAND_SEL_DEFAULT && dev->dbdc_support) if (val == MT_EE_BAND_SEL_DEFAULT &&
val = ext_phy ? MT_EE_BAND_SEL_5GHZ : MT_EE_BAND_SEL_2GHZ; (!is_mt7915(&dev->mt76) || dev->dbdc_support))
val = phy->band_idx ? MT_EE_BAND_SEL_5GHZ : MT_EE_BAND_SEL_2GHZ;
switch (val) { switch (val) {
case MT_EE_BAND_SEL_5GHZ: case MT_EE_BAND_SEL_5GHZ:
...@@ -168,7 +168,7 @@ void mt7915_eeprom_parse_hw_cap(struct mt7915_dev *dev, ...@@ -168,7 +168,7 @@ void mt7915_eeprom_parse_hw_cap(struct mt7915_dev *dev,
eeprom[MT_EE_WIFI_CONF]); eeprom[MT_EE_WIFI_CONF]);
} else { } else {
nss = FIELD_GET(MT_EE_WIFI_CONF0_TX_PATH, nss = FIELD_GET(MT_EE_WIFI_CONF0_TX_PATH,
eeprom[MT_EE_WIFI_CONF + ext_phy]); eeprom[MT_EE_WIFI_CONF + phy->band_idx]);
} }
if (!nss || nss > 4) if (!nss || nss > 4)
...@@ -181,12 +181,12 @@ void mt7915_eeprom_parse_hw_cap(struct mt7915_dev *dev, ...@@ -181,12 +181,12 @@ void mt7915_eeprom_parse_hw_cap(struct mt7915_dev *dev,
if (is_mt7915(&dev->mt76)) { if (is_mt7915(&dev->mt76)) {
nss_band = FIELD_GET(MT_EE_WIFI_CONF3_TX_PATH_B0, nss_band = FIELD_GET(MT_EE_WIFI_CONF3_TX_PATH_B0,
eeprom[MT_EE_WIFI_CONF + 3]); eeprom[MT_EE_WIFI_CONF + 3]);
if (ext_phy) if (phy->band_idx)
nss_band = FIELD_GET(MT_EE_WIFI_CONF3_TX_PATH_B1, nss_band = FIELD_GET(MT_EE_WIFI_CONF3_TX_PATH_B1,
eeprom[MT_EE_WIFI_CONF + 3]); eeprom[MT_EE_WIFI_CONF + 3]);
} else { } else {
nss_band = FIELD_GET(MT_EE_WIFI_CONF_STREAM_NUM, nss_band = FIELD_GET(MT_EE_WIFI_CONF_STREAM_NUM,
eeprom[MT_EE_WIFI_CONF + 2 + ext_phy]); eeprom[MT_EE_WIFI_CONF + 2 + phy->band_idx]);
} }
nss_band_max = is_mt7986(&dev->mt76) ? nss_band_max = is_mt7986(&dev->mt76) ?
...@@ -201,8 +201,8 @@ void mt7915_eeprom_parse_hw_cap(struct mt7915_dev *dev, ...@@ -201,8 +201,8 @@ void mt7915_eeprom_parse_hw_cap(struct mt7915_dev *dev,
if (nss_band > nss) { if (nss_band > nss) {
dev_warn(dev->mt76.dev, dev_warn(dev->mt76.dev,
"nss mismatch, nss(%d) nss_band(%d) ext_phy(%d)\n", "nss mismatch, nss(%d) nss_band(%d) band(%d) ext_phy(%d)\n",
nss, nss_band, ext_phy); nss, nss_band, phy->band_idx, ext_phy);
nss = nss_band; nss = nss_band;
} }
......
...@@ -486,6 +486,9 @@ static int mt7915_register_ext_phy(struct mt7915_dev *dev) ...@@ -486,6 +486,9 @@ static int mt7915_register_ext_phy(struct mt7915_dev *dev)
phy->dev = dev; phy->dev = dev;
phy->mt76 = mphy; phy->mt76 = mphy;
/* Bind main phy to band0 and ext_phy to band1 for dbdc case */
phy->band_idx = 1;
INIT_DELAYED_WORK(&mphy->mac_work, mt7915_mac_work); INIT_DELAYED_WORK(&mphy->mac_work, mt7915_mac_work);
mt7915_eeprom_parse_hw_cap(dev, phy); mt7915_eeprom_parse_hw_cap(dev, phy);
...@@ -505,7 +508,7 @@ static int mt7915_register_ext_phy(struct mt7915_dev *dev) ...@@ -505,7 +508,7 @@ static int mt7915_register_ext_phy(struct mt7915_dev *dev)
/* init wiphy according to mphy and phy */ /* init wiphy according to mphy and phy */
mt7915_init_wiphy(mphy->hw); mt7915_init_wiphy(mphy->hw);
ret = mt7915_init_tx_queues(phy, MT_TXQ_ID(1), ret = mt7915_init_tx_queues(phy, MT_TXQ_ID(phy->band_idx),
MT7915_TX_RING_SIZE, MT7915_TX_RING_SIZE,
MT_TXQ_RING_BASE(1)); MT_TXQ_RING_BASE(1));
if (ret) if (ret)
...@@ -597,6 +600,32 @@ static void mt7915_wfsys_reset(struct mt7915_dev *dev) ...@@ -597,6 +600,32 @@ static void mt7915_wfsys_reset(struct mt7915_dev *dev)
} }
} }
static bool mt7915_band_config(struct mt7915_dev *dev)
{
bool ret = true;
dev->phy.band_idx = 0;
if (is_mt7986(&dev->mt76)) {
u32 sku = mt7915_check_adie(dev, true);
/*
* for mt7986, dbdc support is determined by the number
* of adie chips and the main phy is bound to band1 when
* dbdc is disabled.
*/
if (sku == MT7975_ONE_ADIE || sku == MT7976_ONE_ADIE) {
dev->phy.band_idx = 1;
ret = false;
}
} else {
ret = is_mt7915(&dev->mt76) ?
!!(mt76_rr(dev, MT_HW_BOUND) & BIT(5)) : true;
}
return ret;
}
static int mt7915_init_hardware(struct mt7915_dev *dev) static int mt7915_init_hardware(struct mt7915_dev *dev)
{ {
int ret, idx; int ret, idx;
...@@ -605,8 +634,7 @@ static int mt7915_init_hardware(struct mt7915_dev *dev) ...@@ -605,8 +634,7 @@ static int mt7915_init_hardware(struct mt7915_dev *dev)
INIT_WORK(&dev->init_work, mt7915_init_work); INIT_WORK(&dev->init_work, mt7915_init_work);
dev->dbdc_support = is_mt7915(&dev->mt76) ? dev->dbdc_support = mt7915_band_config(dev);
!!(mt76_rr(dev, MT_HW_BOUND) & BIT(5)) : true;
/* If MCU was already running, it is likely in a bad state */ /* If MCU was already running, it is likely in a bad state */
if (mt76_get_field(dev, MT_TOP_MISC, MT_TOP_MISC_FW_STATE) > if (mt76_get_field(dev, MT_TOP_MISC, MT_TOP_MISC_FW_STATE) >
......
...@@ -49,7 +49,7 @@ static int mt7915_start(struct ieee80211_hw *hw) ...@@ -49,7 +49,7 @@ static int mt7915_start(struct ieee80211_hw *hw)
mt7915_mac_enable_nf(dev, 0); mt7915_mac_enable_nf(dev, 0);
} }
if (phy != &dev->phy) { if (phy != &dev->phy || phy->band_idx) {
ret = mt76_connac_mcu_set_pm(&dev->mt76, 1, 0); ret = mt76_connac_mcu_set_pm(&dev->mt76, 1, 0);
if (ret) if (ret)
goto out; goto out;
...@@ -217,7 +217,7 @@ static int mt7915_add_interface(struct ieee80211_hw *hw, ...@@ -217,7 +217,7 @@ static int mt7915_add_interface(struct ieee80211_hw *hw,
} }
mvif->mt76.omac_idx = idx; mvif->mt76.omac_idx = idx;
mvif->phy = phy; mvif->phy = phy;
mvif->mt76.band_idx = ext_phy; mvif->mt76.band_idx = phy->band_idx;
mvif->mt76.wmm_idx = vif->type != NL80211_IFTYPE_AP; mvif->mt76.wmm_idx = vif->type != NL80211_IFTYPE_AP;
if (ext_phy) if (ext_phy)
...@@ -235,7 +235,7 @@ static int mt7915_add_interface(struct ieee80211_hw *hw, ...@@ -235,7 +235,7 @@ static int mt7915_add_interface(struct ieee80211_hw *hw,
INIT_LIST_HEAD(&mvif->sta.rc_list); INIT_LIST_HEAD(&mvif->sta.rc_list);
INIT_LIST_HEAD(&mvif->sta.poll_list); INIT_LIST_HEAD(&mvif->sta.poll_list);
mvif->sta.wcid.idx = idx; mvif->sta.wcid.idx = idx;
mvif->sta.wcid.ext_phy = mvif->mt76.band_idx; mvif->sta.wcid.ext_phy = ext_phy;
mvif->sta.wcid.hw_key_idx = -1; mvif->sta.wcid.hw_key_idx = -1;
mvif->sta.wcid.tx_info |= MT_WCID_TX_INFO_SET; mvif->sta.wcid.tx_info |= MT_WCID_TX_INFO_SET;
mt76_packet_id_init(&mvif->sta.wcid); mt76_packet_id_init(&mvif->sta.wcid);
...@@ -654,6 +654,7 @@ int mt7915_mac_sta_add(struct mt76_dev *mdev, struct ieee80211_vif *vif, ...@@ -654,6 +654,7 @@ int mt7915_mac_sta_add(struct mt76_dev *mdev, struct ieee80211_vif *vif,
struct mt7915_dev *dev = container_of(mdev, struct mt7915_dev, mt76); struct mt7915_dev *dev = container_of(mdev, struct mt7915_dev, mt76);
struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv; struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv; struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
bool ext_phy = mvif->phy != &dev->phy;
int ret, idx; int ret, idx;
idx = mt76_wcid_alloc(dev->mt76.wcid_mask, MT7915_WTBL_STA); idx = mt76_wcid_alloc(dev->mt76.wcid_mask, MT7915_WTBL_STA);
...@@ -665,7 +666,7 @@ int mt7915_mac_sta_add(struct mt76_dev *mdev, struct ieee80211_vif *vif, ...@@ -665,7 +666,7 @@ int mt7915_mac_sta_add(struct mt76_dev *mdev, struct ieee80211_vif *vif,
msta->vif = mvif; msta->vif = mvif;
msta->wcid.sta = 1; msta->wcid.sta = 1;
msta->wcid.idx = idx; msta->wcid.idx = idx;
msta->wcid.ext_phy = mvif->mt76.band_idx; msta->wcid.ext_phy = ext_phy;
msta->wcid.tx_info |= MT_WCID_TX_INFO_SET; msta->wcid.tx_info |= MT_WCID_TX_INFO_SET;
msta->jiffies = jiffies; msta->jiffies = jiffies;
...@@ -1238,7 +1239,6 @@ void mt7915_get_et_stats(struct ieee80211_hw *hw, ...@@ -1238,7 +1239,6 @@ void mt7915_get_et_stats(struct ieee80211_hw *hw,
}; };
struct mib_stats *mib = &phy->mib; struct mib_stats *mib = &phy->mib;
/* See mt7915_ampdu_stat_read_phy, etc */ /* See mt7915_ampdu_stat_read_phy, etc */
bool ext_phy = phy != &dev->phy;
int i, n, ei = 0; int i, n, ei = 0;
mutex_lock(&dev->mt76.mutex); mutex_lock(&dev->mt76.mutex);
...@@ -1255,7 +1255,7 @@ void mt7915_get_et_stats(struct ieee80211_hw *hw, ...@@ -1255,7 +1255,7 @@ void mt7915_get_et_stats(struct ieee80211_hw *hw,
data[ei++] = mib->tx_pkt_ibf_cnt; data[ei++] = mib->tx_pkt_ibf_cnt;
/* Tx ampdu stat */ /* Tx ampdu stat */
n = ext_phy ? ARRAY_SIZE(dev->mt76.aggr_stats) / 2 : 0; n = phy->band_idx ? ARRAY_SIZE(dev->mt76.aggr_stats) / 2 : 0;
for (i = 0; i < 15 /*ARRAY_SIZE(bound)*/; i++) for (i = 0; i < 15 /*ARRAY_SIZE(bound)*/; i++)
data[ei++] = dev->mt76.aggr_stats[i + n]; data[ei++] = dev->mt76.aggr_stats[i + n];
......
...@@ -334,7 +334,7 @@ mt7915_mcu_rx_csa_notify(struct mt7915_dev *dev, struct sk_buff *skb) ...@@ -334,7 +334,7 @@ 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->mt76.phy2) if ((c->band_idx && !dev->phy.band_idx) && dev->mt76.phy2)
mphy = dev->mt76.phy2; mphy = dev->mt76.phy2;
ieee80211_iterate_active_interfaces_atomic(mphy->hw, ieee80211_iterate_active_interfaces_atomic(mphy->hw,
...@@ -353,7 +353,7 @@ mt7915_mcu_rx_thermal_notify(struct mt7915_dev *dev, struct sk_buff *skb) ...@@ -353,7 +353,7 @@ 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->mt76.phy2) if ((t->ctrl.band_idx && !dev->phy.band_idx) && dev->mt76.phy2)
mphy = dev->mt76.phy2; mphy = dev->mt76.phy2;
phy = (struct mt7915_phy *)mphy->priv; phy = (struct mt7915_phy *)mphy->priv;
...@@ -368,7 +368,7 @@ mt7915_mcu_rx_radar_detected(struct mt7915_dev *dev, struct sk_buff *skb) ...@@ -368,7 +368,7 @@ 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->mt76.phy2) if ((r->band_idx && !dev->phy.band_idx) && dev->mt76.phy2)
mphy = dev->mt76.phy2; mphy = dev->mt76.phy2;
if (r->band_idx == MT_RX_SEL2) if (r->band_idx == MT_RX_SEL2)
...@@ -558,12 +558,7 @@ mt7915_mcu_bss_rfch_tlv(struct sk_buff *skb, struct ieee80211_vif *vif, ...@@ -558,12 +558,7 @@ mt7915_mcu_bss_rfch_tlv(struct sk_buff *skb, struct ieee80211_vif *vif,
} }
if (vif->bss_conf.he_support && vif->type == NL80211_IFTYPE_STATION) { if (vif->bss_conf.he_support && vif->type == NL80211_IFTYPE_STATION) {
struct mt7915_dev *dev = phy->dev; struct mt76_phy *mphy = phy->mt76;
struct mt76_phy *mphy = &dev->mt76.phy;
bool ext_phy = phy != &dev->phy;
if (ext_phy && dev->mt76.phy2)
mphy = dev->mt76.phy2;
ch->he_ru26_block = ch->he_ru26_block =
mt7915_check_he_obss_narrow_bw_ru(mphy->hw, vif); mt7915_check_he_obss_narrow_bw_ru(mphy->hw, vif);
...@@ -1246,8 +1241,7 @@ mt7915_mcu_sta_bfer_tlv(struct mt7915_dev *dev, struct sk_buff *skb, ...@@ -1246,8 +1241,7 @@ mt7915_mcu_sta_bfer_tlv(struct mt7915_dev *dev, struct sk_buff *skb,
struct ieee80211_vif *vif, struct ieee80211_sta *sta) struct ieee80211_vif *vif, struct ieee80211_sta *sta)
{ {
struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv; struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
struct mt7915_phy *phy = struct mt7915_phy *phy = mvif->phy;
mvif->mt76.band_idx ? mt7915_ext_phy(dev) : &dev->phy;
int tx_ant = hweight8(phy->mt76->chainmask) - 1; int tx_ant = hweight8(phy->mt76->chainmask) - 1;
struct sta_rec_bf *bf; struct sta_rec_bf *bf;
struct tlv *tlv; struct tlv *tlv;
...@@ -1313,8 +1307,7 @@ mt7915_mcu_sta_bfee_tlv(struct mt7915_dev *dev, struct sk_buff *skb, ...@@ -1313,8 +1307,7 @@ mt7915_mcu_sta_bfee_tlv(struct mt7915_dev *dev, struct sk_buff *skb,
struct ieee80211_vif *vif, struct ieee80211_sta *sta) struct ieee80211_vif *vif, struct ieee80211_sta *sta)
{ {
struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv; struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
struct mt7915_phy *phy = struct mt7915_phy *phy = mvif->phy;
mvif->mt76.band_idx ? mt7915_ext_phy(dev) : &dev->phy;
int tx_ant = hweight8(phy->mt76->chainmask) - 1; int tx_ant = hweight8(phy->mt76->chainmask) - 1;
struct sta_rec_bfee *bfee; struct sta_rec_bfee *bfee;
struct tlv *tlv; struct tlv *tlv;
...@@ -1927,6 +1920,7 @@ int mt7915_mcu_add_beacon(struct ieee80211_hw *hw, ...@@ -1927,6 +1920,7 @@ int mt7915_mcu_add_beacon(struct ieee80211_hw *hw,
struct tlv *tlv; struct tlv *tlv;
struct bss_info_bcn *bcn; struct bss_info_bcn *bcn;
int len = MT7915_BEACON_UPDATE_SIZE + MAX_BEACON_SIZE; int len = MT7915_BEACON_UPDATE_SIZE + MAX_BEACON_SIZE;
bool ext_phy = phy != &dev->phy;
rskb = __mt76_connac_mcu_alloc_sta_req(&dev->mt76, &mvif->mt76, rskb = __mt76_connac_mcu_alloc_sta_req(&dev->mt76, &mvif->mt76,
NULL, len); NULL, len);
...@@ -1950,7 +1944,7 @@ int mt7915_mcu_add_beacon(struct ieee80211_hw *hw, ...@@ -1950,7 +1944,7 @@ int mt7915_mcu_add_beacon(struct ieee80211_hw *hw,
return -EINVAL; return -EINVAL;
} }
if (mvif->mt76.band_idx) { if (ext_phy) {
info = IEEE80211_SKB_CB(skb); info = IEEE80211_SKB_CB(skb);
info->hw_queue |= MT_TX_HW_QUEUE_EXT_PHY; info->hw_queue |= MT_TX_HW_QUEUE_EXT_PHY;
} }
...@@ -2291,7 +2285,7 @@ int mt7915_mcu_muru_debug_get(struct mt7915_phy *phy, void *ms) ...@@ -2291,7 +2285,7 @@ int mt7915_mcu_muru_debug_get(struct mt7915_phy *phy, void *ms)
u8 band_idx; u8 band_idx;
} req = { } req = {
.cmd = cpu_to_le32(MURU_GET_TXC_TX_STATS), .cmd = cpu_to_le32(MURU_GET_TXC_TX_STATS),
.band_idx = phy != &dev->phy, .band_idx = phy->band_idx,
}; };
ret = mt76_mcu_send_and_get_msg(&dev->mt76, MCU_EXT_CMD(MURU_CTRL), ret = mt76_mcu_send_and_get_msg(&dev->mt76, MCU_EXT_CMD(MURU_CTRL),
...@@ -2764,7 +2758,6 @@ int mt7915_mcu_set_chan_info(struct mt7915_phy *phy, int cmd) ...@@ -2764,7 +2758,6 @@ int mt7915_mcu_set_chan_info(struct mt7915_phy *phy, int cmd)
struct mt7915_dev *dev = phy->dev; struct mt7915_dev *dev = phy->dev;
struct cfg80211_chan_def *chandef = &phy->mt76->chandef; struct cfg80211_chan_def *chandef = &phy->mt76->chandef;
int freq1 = chandef->center_freq1; int freq1 = chandef->center_freq1;
bool ext_phy = phy != &dev->phy;
struct { struct {
u8 control_ch; u8 control_ch;
u8 center_ch; u8 center_ch;
...@@ -2788,7 +2781,7 @@ int mt7915_mcu_set_chan_info(struct mt7915_phy *phy, int cmd) ...@@ -2788,7 +2781,7 @@ int mt7915_mcu_set_chan_info(struct mt7915_phy *phy, int cmd)
.bw = mt76_connac_chan_bw(chandef), .bw = mt76_connac_chan_bw(chandef),
.tx_streams_num = hweight8(phy->mt76->antenna_mask), .tx_streams_num = hweight8(phy->mt76->antenna_mask),
.rx_streams = phy->mt76->antenna_mask, .rx_streams = phy->mt76->antenna_mask,
.band_idx = ext_phy, .band_idx = phy->band_idx,
.channel_band = chandef->chan->band, .channel_band = chandef->chan->band,
}; };
...@@ -2800,7 +2793,7 @@ int mt7915_mcu_set_chan_info(struct mt7915_phy *phy, int cmd) ...@@ -2800,7 +2793,7 @@ int mt7915_mcu_set_chan_info(struct mt7915_phy *phy, int cmd)
req.tx_streams_num = fls(phy->mt76->test.tx_antenna_mask); req.tx_streams_num = fls(phy->mt76->test.tx_antenna_mask);
req.rx_streams = phy->mt76->test.tx_antenna_mask; req.rx_streams = phy->mt76->test.tx_antenna_mask;
if (ext_phy) if (phy != &dev->phy)
req.rx_streams >>= dev->chainshift; req.rx_streams >>= dev->chainshift;
} }
#endif #endif
...@@ -3154,7 +3147,7 @@ int mt7915_mcu_set_thermal_throttling(struct mt7915_phy *phy, u8 state) ...@@ -3154,7 +3147,7 @@ int mt7915_mcu_set_thermal_throttling(struct mt7915_phy *phy, u8 state)
u8 rsv[2]; u8 rsv[2];
} __packed req = { } __packed req = {
.ctrl = { .ctrl = {
.band_idx = phy != &dev->phy, .band_idx = phy->band_idx,
}, },
}; };
int level; int level;
......
...@@ -234,6 +234,7 @@ struct mt7915_phy { ...@@ -234,6 +234,7 @@ struct mt7915_phy {
u32 rxfilter; u32 rxfilter;
u64 omac_mask; u64 omac_mask;
u8 band_idx;
u16 noise; u16 noise;
......
...@@ -198,7 +198,6 @@ mt7915_tm_set_ipg_params(struct mt7915_phy *phy, u32 ipg, u8 mode) ...@@ -198,7 +198,6 @@ mt7915_tm_set_ipg_params(struct mt7915_phy *phy, u32 ipg, u8 mode)
u8 slot_time = 9, sifs = TM_DEFAULT_SIFS; u8 slot_time = 9, sifs = TM_DEFAULT_SIFS;
u8 aifsn = TM_MIN_AIFSN; u8 aifsn = TM_MIN_AIFSN;
u32 i2t_time, tr2t_time, txv_time; u32 i2t_time, tr2t_time, txv_time;
bool ext_phy = phy != &dev->phy;
u16 cw = 0; u16 cw = 0;
if (ipg < sig_ext + slot_time + sifs) if (ipg < sig_ext + slot_time + sifs)
...@@ -236,14 +235,14 @@ mt7915_tm_set_ipg_params(struct mt7915_phy *phy, u32 ipg, u8 mode) ...@@ -236,14 +235,14 @@ mt7915_tm_set_ipg_params(struct mt7915_phy *phy, u32 ipg, u8 mode)
} }
} }
done: done:
txv_time = mt76_get_field(dev, MT_TMAC_ATCR(ext_phy), txv_time = mt76_get_field(dev, MT_TMAC_ATCR(phy->band_idx),
MT_TMAC_ATCR_TXV_TOUT); MT_TMAC_ATCR_TXV_TOUT);
txv_time *= 50; /* normal clock time */ txv_time *= 50; /* normal clock time */
i2t_time = (slot_time * 1000 - txv_time - BBP_PROC_TIME) / 50; i2t_time = (slot_time * 1000 - txv_time - BBP_PROC_TIME) / 50;
tr2t_time = (sifs * 1000 - txv_time - BBP_PROC_TIME) / 50; tr2t_time = (sifs * 1000 - txv_time - BBP_PROC_TIME) / 50;
mt76_set(dev, MT_TMAC_TRCR0(ext_phy), mt76_set(dev, MT_TMAC_TRCR0(phy->band_idx),
FIELD_PREP(MT_TMAC_TRCR0_TR2T_CHK, tr2t_time) | FIELD_PREP(MT_TMAC_TRCR0_TR2T_CHK, tr2t_time) |
FIELD_PREP(MT_TMAC_TRCR0_I2T_CHK, i2t_time)); FIELD_PREP(MT_TMAC_TRCR0_I2T_CHK, i2t_time));
...@@ -337,7 +336,6 @@ mt7915_tm_reg_backup_restore(struct mt7915_phy *phy) ...@@ -337,7 +336,6 @@ mt7915_tm_reg_backup_restore(struct mt7915_phy *phy)
{ {
int n_regs = ARRAY_SIZE(reg_backup_list); int n_regs = ARRAY_SIZE(reg_backup_list);
struct mt7915_dev *dev = phy->dev; struct mt7915_dev *dev = phy->dev;
bool ext_phy = phy != &dev->phy;
u32 *b = phy->test.reg_backup; u32 *b = phy->test.reg_backup;
int i; int i;
...@@ -361,7 +359,7 @@ mt7915_tm_reg_backup_restore(struct mt7915_phy *phy) ...@@ -361,7 +359,7 @@ mt7915_tm_reg_backup_restore(struct mt7915_phy *phy)
if (phy->mt76->test.state == MT76_TM_STATE_OFF) { if (phy->mt76->test.state == MT76_TM_STATE_OFF) {
for (i = 0; i < n_regs; i++) for (i = 0; i < n_regs; i++)
mt76_wr(dev, reg_backup_list[i].band[ext_phy], b[i]); mt76_wr(dev, reg_backup_list[i].band[phy->band_idx], b[i]);
return; return;
} }
...@@ -372,33 +370,33 @@ mt7915_tm_reg_backup_restore(struct mt7915_phy *phy) ...@@ -372,33 +370,33 @@ mt7915_tm_reg_backup_restore(struct mt7915_phy *phy)
phy->test.reg_backup = b; phy->test.reg_backup = b;
for (i = 0; i < n_regs; i++) for (i = 0; i < n_regs; i++)
b[i] = mt76_rr(dev, reg_backup_list[i].band[ext_phy]); b[i] = mt76_rr(dev, reg_backup_list[i].band[phy->band_idx]);
} }
mt76_clear(dev, MT_AGG_PCR0(ext_phy, 0), MT_AGG_PCR0_MM_PROT | mt76_clear(dev, MT_AGG_PCR0(phy->band_idx, 0), MT_AGG_PCR0_MM_PROT |
MT_AGG_PCR0_GF_PROT | MT_AGG_PCR0_ERP_PROT | MT_AGG_PCR0_GF_PROT | MT_AGG_PCR0_ERP_PROT |
MT_AGG_PCR0_VHT_PROT | MT_AGG_PCR0_BW20_PROT | MT_AGG_PCR0_VHT_PROT | MT_AGG_PCR0_BW20_PROT |
MT_AGG_PCR0_BW40_PROT | MT_AGG_PCR0_BW80_PROT); MT_AGG_PCR0_BW40_PROT | MT_AGG_PCR0_BW80_PROT);
mt76_set(dev, MT_AGG_PCR0(ext_phy, 0), MT_AGG_PCR0_PTA_WIN_DIS); mt76_set(dev, MT_AGG_PCR0(phy->band_idx, 0), MT_AGG_PCR0_PTA_WIN_DIS);
mt76_wr(dev, MT_AGG_PCR0(ext_phy, 1), MT_AGG_PCR1_RTS0_NUM_THRES | mt76_wr(dev, MT_AGG_PCR0(phy->band_idx, 1), MT_AGG_PCR1_RTS0_NUM_THRES |
MT_AGG_PCR1_RTS0_LEN_THRES); MT_AGG_PCR1_RTS0_LEN_THRES);
mt76_clear(dev, MT_AGG_MRCR(ext_phy), MT_AGG_MRCR_BAR_CNT_LIMIT | mt76_clear(dev, MT_AGG_MRCR(phy->band_idx), MT_AGG_MRCR_BAR_CNT_LIMIT |
MT_AGG_MRCR_LAST_RTS_CTS_RN | MT_AGG_MRCR_RTS_FAIL_LIMIT | MT_AGG_MRCR_LAST_RTS_CTS_RN | MT_AGG_MRCR_RTS_FAIL_LIMIT |
MT_AGG_MRCR_TXCMD_RTS_FAIL_LIMIT); MT_AGG_MRCR_TXCMD_RTS_FAIL_LIMIT);
mt76_rmw(dev, MT_AGG_MRCR(ext_phy), MT_AGG_MRCR_RTS_FAIL_LIMIT | mt76_rmw(dev, MT_AGG_MRCR(phy->band_idx), MT_AGG_MRCR_RTS_FAIL_LIMIT |
MT_AGG_MRCR_TXCMD_RTS_FAIL_LIMIT, MT_AGG_MRCR_TXCMD_RTS_FAIL_LIMIT,
FIELD_PREP(MT_AGG_MRCR_RTS_FAIL_LIMIT, 1) | FIELD_PREP(MT_AGG_MRCR_RTS_FAIL_LIMIT, 1) |
FIELD_PREP(MT_AGG_MRCR_TXCMD_RTS_FAIL_LIMIT, 1)); FIELD_PREP(MT_AGG_MRCR_TXCMD_RTS_FAIL_LIMIT, 1));
mt76_wr(dev, MT_TMAC_TFCR0(ext_phy), 0); mt76_wr(dev, MT_TMAC_TFCR0(phy->band_idx), 0);
mt76_clear(dev, MT_TMAC_TCR0(ext_phy), MT_TMAC_TCR0_TBTT_STOP_CTRL); mt76_clear(dev, MT_TMAC_TCR0(phy->band_idx), MT_TMAC_TCR0_TBTT_STOP_CTRL);
/* config rx filter for testmode rx */ /* config rx filter for testmode rx */
mt76_wr(dev, MT_WF_RFCR(ext_phy), 0xcf70a); mt76_wr(dev, MT_WF_RFCR(phy->band_idx), 0xcf70a);
mt76_wr(dev, MT_WF_RFCR1(ext_phy), 0); mt76_wr(dev, MT_WF_RFCR1(phy->band_idx), 0);
} }
static void static void
...@@ -724,7 +722,6 @@ mt7915_tm_dump_stats(struct mt76_phy *mphy, struct sk_buff *msg) ...@@ -724,7 +722,6 @@ mt7915_tm_dump_stats(struct mt76_phy *mphy, struct sk_buff *msg)
{ {
struct mt7915_phy *phy = mphy->priv; struct mt7915_phy *phy = mphy->priv;
struct mt7915_dev *dev = phy->dev; struct mt7915_dev *dev = phy->dev;
bool ext_phy = phy != &dev->phy;
enum mt76_rxq_id q; enum mt76_rxq_id q;
void *rx, *rssi; void *rx, *rssi;
u16 fcs_err; u16 fcs_err;
...@@ -773,11 +770,11 @@ mt7915_tm_dump_stats(struct mt76_phy *mphy, struct sk_buff *msg) ...@@ -773,11 +770,11 @@ mt7915_tm_dump_stats(struct mt76_phy *mphy, struct sk_buff *msg)
nla_nest_end(msg, rx); nla_nest_end(msg, rx);
cnt = mt76_rr(dev, MT_MIB_SDR3(ext_phy)); cnt = mt76_rr(dev, MT_MIB_SDR3(phy->band_idx));
fcs_err = is_mt7915(&dev->mt76) ? FIELD_GET(MT_MIB_SDR3_FCS_ERR_MASK, cnt) : fcs_err = is_mt7915(&dev->mt76) ? FIELD_GET(MT_MIB_SDR3_FCS_ERR_MASK, cnt) :
FIELD_GET(MT_MIB_SDR3_FCS_ERR_MASK_MT7916, cnt); FIELD_GET(MT_MIB_SDR3_FCS_ERR_MASK_MT7916, cnt);
q = ext_phy ? MT_RXQ_EXT : MT_RXQ_MAIN; q = phy->band_idx ? MT_RXQ_EXT : MT_RXQ_MAIN;
mphy->test.rx_stats.packets[q] += fcs_err; mphy->test.rx_stats.packets[q] += fcs_err;
mphy->test.rx_stats.fcs_error[q] += fcs_err; mphy->test.rx_stats.fcs_error[q] += fcs_err;
......
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