mirror of
https://github.com/outbackdingo/mt76.git
synced 2026-10-24 13:26:48 +00:00
mt76: testmode: introduce dbdc support
Add testmode support for DBDC NICs (both MT7615D and MT7915D work). Testmode data and parameters are moved from per-dev to per-phy for maintaining the value of each band. Signed-off-by: Shayne Chen <[email protected]> Acked-by: Ryder Lee <[email protected]> Signed-off-by: Felix Fietkau <[email protected]>
This commit is contained in:
committed by
Felix Fietkau
parent
d1b827781f
commit
a897a69769
+48
-40
@@ -19,11 +19,11 @@ static const struct nla_policy mt76_tm_policy[NUM_MT76_TM_ATTRS] = {
|
||||
[MT76_TM_ATTR_FREQ_OFFSET] = { .type = NLA_U32 },
|
||||
};
|
||||
|
||||
void mt76_testmode_tx_pending(struct mt76_dev *dev)
|
||||
void mt76_testmode_tx_pending(struct mt76_phy *phy)
|
||||
{
|
||||
struct mt76_testmode_data *td = &dev->test;
|
||||
struct mt76_testmode_data *td = &phy->test;
|
||||
struct mt76_dev *dev = phy->dev;
|
||||
struct mt76_wcid *wcid = &dev->global_wcid;
|
||||
struct mt76_phy *phy = &dev->phy;
|
||||
struct sk_buff *skb = td->tx_skb;
|
||||
struct mt76_queue *q;
|
||||
int qid;
|
||||
@@ -56,10 +56,9 @@ void mt76_testmode_tx_pending(struct mt76_dev *dev)
|
||||
|
||||
|
||||
static int
|
||||
mt76_testmode_tx_init(struct mt76_dev *dev)
|
||||
mt76_testmode_tx_init(struct mt76_phy *phy)
|
||||
{
|
||||
struct mt76_testmode_data *td = &dev->test;
|
||||
struct mt76_phy *phy = &dev->phy;
|
||||
struct mt76_testmode_data *td = &phy->test;
|
||||
struct ieee80211_tx_info *info;
|
||||
struct ieee80211_hdr *hdr;
|
||||
struct sk_buff *skb;
|
||||
@@ -67,6 +66,7 @@ mt76_testmode_tx_init(struct mt76_dev *dev)
|
||||
IEEE80211_FCTL_FROMDS;
|
||||
struct ieee80211_tx_rate *rate;
|
||||
u8 max_nss = hweight8(phy->antenna_mask);
|
||||
bool ext_phy = phy != &phy->dev->phy;
|
||||
|
||||
if (td->tx_antenna_mask)
|
||||
max_nss = min_t(u8, max_nss, hweight8(td->tx_antenna_mask));
|
||||
@@ -88,6 +88,9 @@ mt76_testmode_tx_init(struct mt76_dev *dev)
|
||||
IEEE80211_TX_CTL_NO_ACK |
|
||||
IEEE80211_TX_CTL_NO_PS_BUFFER;
|
||||
|
||||
if (ext_phy)
|
||||
info->hw_queue |= MT_TX_HW_QUEUE_EXT_PHY;
|
||||
|
||||
if (td->tx_rate_mode > MT76_TM_TX_MODE_VHT)
|
||||
goto out;
|
||||
|
||||
@@ -166,9 +169,10 @@ out:
|
||||
}
|
||||
|
||||
static void
|
||||
mt76_testmode_tx_start(struct mt76_dev *dev)
|
||||
mt76_testmode_tx_start(struct mt76_phy *phy)
|
||||
{
|
||||
struct mt76_testmode_data *td = &dev->test;
|
||||
struct mt76_testmode_data *td = &phy->test;
|
||||
struct mt76_dev *dev = phy->dev;
|
||||
|
||||
td->tx_queued = 0;
|
||||
td->tx_done = 0;
|
||||
@@ -177,9 +181,10 @@ mt76_testmode_tx_start(struct mt76_dev *dev)
|
||||
}
|
||||
|
||||
static void
|
||||
mt76_testmode_tx_stop(struct mt76_dev *dev)
|
||||
mt76_testmode_tx_stop(struct mt76_phy *phy)
|
||||
{
|
||||
struct mt76_testmode_data *td = &dev->test;
|
||||
struct mt76_testmode_data *td = &phy->test;
|
||||
struct mt76_dev *dev = phy->dev;
|
||||
|
||||
mt76_worker_disable(&dev->tx_worker);
|
||||
|
||||
@@ -206,9 +211,9 @@ mt76_testmode_param_present(struct mt76_testmode_data *td, u16 idx)
|
||||
}
|
||||
|
||||
static void
|
||||
mt76_testmode_init_defaults(struct mt76_dev *dev)
|
||||
mt76_testmode_init_defaults(struct mt76_phy *phy)
|
||||
{
|
||||
struct mt76_testmode_data *td = &dev->test;
|
||||
struct mt76_testmode_data *td = &phy->test;
|
||||
|
||||
if (td->tx_msdu_len > 0)
|
||||
return;
|
||||
@@ -220,49 +225,50 @@ mt76_testmode_init_defaults(struct mt76_dev *dev)
|
||||
}
|
||||
|
||||
static int
|
||||
__mt76_testmode_set_state(struct mt76_dev *dev, enum mt76_testmode_state state)
|
||||
__mt76_testmode_set_state(struct mt76_phy *phy, enum mt76_testmode_state state)
|
||||
{
|
||||
enum mt76_testmode_state prev_state = dev->test.state;
|
||||
enum mt76_testmode_state prev_state = phy->test.state;
|
||||
struct mt76_dev *dev = phy->dev;
|
||||
int err;
|
||||
|
||||
if (prev_state == MT76_TM_STATE_TX_FRAMES)
|
||||
mt76_testmode_tx_stop(dev);
|
||||
mt76_testmode_tx_stop(phy);
|
||||
|
||||
if (state == MT76_TM_STATE_TX_FRAMES) {
|
||||
err = mt76_testmode_tx_init(dev);
|
||||
err = mt76_testmode_tx_init(phy);
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
|
||||
err = dev->test_ops->set_state(dev, state);
|
||||
err = dev->test_ops->set_state(phy, state);
|
||||
if (err) {
|
||||
if (state == MT76_TM_STATE_TX_FRAMES)
|
||||
mt76_testmode_tx_stop(dev);
|
||||
mt76_testmode_tx_stop(phy);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
if (state == MT76_TM_STATE_TX_FRAMES)
|
||||
mt76_testmode_tx_start(dev);
|
||||
mt76_testmode_tx_start(phy);
|
||||
else if (state == MT76_TM_STATE_RX_FRAMES) {
|
||||
memset(&dev->test.rx_stats, 0, sizeof(dev->test.rx_stats));
|
||||
memset(&phy->test.rx_stats, 0, sizeof(phy->test.rx_stats));
|
||||
}
|
||||
|
||||
dev->test.state = state;
|
||||
phy->test.state = state;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int mt76_testmode_set_state(struct mt76_dev *dev, enum mt76_testmode_state state)
|
||||
int mt76_testmode_set_state(struct mt76_phy *phy, enum mt76_testmode_state state)
|
||||
{
|
||||
struct mt76_testmode_data *td = &dev->test;
|
||||
struct ieee80211_hw *hw = dev->phy.hw;
|
||||
struct mt76_testmode_data *td = &phy->test;
|
||||
struct ieee80211_hw *hw = phy->hw;
|
||||
|
||||
if (state == td->state && state == MT76_TM_STATE_OFF)
|
||||
return 0;
|
||||
|
||||
if (state > MT76_TM_STATE_OFF &&
|
||||
(!test_bit(MT76_STATE_RUNNING, &dev->phy.state) ||
|
||||
(!test_bit(MT76_STATE_RUNNING, &phy->state) ||
|
||||
!(hw->conf.flags & IEEE80211_CONF_MONITOR)))
|
||||
return -ENOTCONN;
|
||||
|
||||
@@ -270,12 +276,12 @@ int mt76_testmode_set_state(struct mt76_dev *dev, enum mt76_testmode_state state
|
||||
td->state != MT76_TM_STATE_IDLE) {
|
||||
int ret;
|
||||
|
||||
ret = __mt76_testmode_set_state(dev, MT76_TM_STATE_IDLE);
|
||||
ret = __mt76_testmode_set_state(phy, MT76_TM_STATE_IDLE);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
||||
return __mt76_testmode_set_state(dev, state);
|
||||
return __mt76_testmode_set_state(phy, state);
|
||||
|
||||
}
|
||||
EXPORT_SYMBOL(mt76_testmode_set_state);
|
||||
@@ -301,8 +307,9 @@ int mt76_testmode_cmd(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
|
||||
{
|
||||
struct mt76_phy *phy = hw->priv;
|
||||
struct mt76_dev *dev = phy->dev;
|
||||
struct mt76_testmode_data *td = &dev->test;
|
||||
struct mt76_testmode_data *td = &phy->test;
|
||||
struct nlattr *tb[NUM_MT76_TM_ATTRS];
|
||||
bool ext_phy = phy != &dev->phy;
|
||||
u32 state;
|
||||
int err;
|
||||
int i;
|
||||
@@ -320,11 +327,11 @@ int mt76_testmode_cmd(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
|
||||
mutex_lock(&dev->mutex);
|
||||
|
||||
if (tb[MT76_TM_ATTR_RESET]) {
|
||||
mt76_testmode_set_state(dev, MT76_TM_STATE_OFF);
|
||||
mt76_testmode_set_state(phy, MT76_TM_STATE_OFF);
|
||||
memset(td, 0, sizeof(*td));
|
||||
}
|
||||
|
||||
mt76_testmode_init_defaults(dev);
|
||||
mt76_testmode_init_defaults(phy);
|
||||
|
||||
if (tb[MT76_TM_ATTR_TX_COUNT])
|
||||
td->tx_count = nla_get_u32(tb[MT76_TM_ATTR_TX_COUNT]);
|
||||
@@ -350,8 +357,8 @@ int mt76_testmode_cmd(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
|
||||
mt76_tm_get_u8(tb[MT76_TM_ATTR_TX_RATE_LDPC], &td->tx_rate_ldpc, 0, 1) ||
|
||||
mt76_tm_get_u8(tb[MT76_TM_ATTR_TX_RATE_STBC], &td->tx_rate_stbc, 0, 1) ||
|
||||
mt76_tm_get_u8(tb[MT76_TM_ATTR_TX_LTF], &td->tx_ltf, 0, 2) ||
|
||||
mt76_tm_get_u8(tb[MT76_TM_ATTR_TX_ANTENNA], &td->tx_antenna_mask, 1,
|
||||
phy->antenna_mask) ||
|
||||
mt76_tm_get_u8(tb[MT76_TM_ATTR_TX_ANTENNA], &td->tx_antenna_mask,
|
||||
1 << (ext_phy * 2), phy->antenna_mask << (ext_phy * 2)) ||
|
||||
mt76_tm_get_u8(tb[MT76_TM_ATTR_TX_POWER_CONTROL],
|
||||
&td->tx_power_control, 0, 1))
|
||||
goto out;
|
||||
@@ -382,7 +389,7 @@ int mt76_testmode_cmd(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
|
||||
}
|
||||
|
||||
if (dev->test_ops->set_params) {
|
||||
err = dev->test_ops->set_params(dev, tb, state);
|
||||
err = dev->test_ops->set_params(phy, tb, state);
|
||||
if (err)
|
||||
goto out;
|
||||
}
|
||||
@@ -393,7 +400,7 @@ int mt76_testmode_cmd(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
|
||||
|
||||
err = 0;
|
||||
if (tb[MT76_TM_ATTR_STATE])
|
||||
err = mt76_testmode_set_state(dev, state);
|
||||
err = mt76_testmode_set_state(phy, state);
|
||||
|
||||
out:
|
||||
mutex_unlock(&dev->mutex);
|
||||
@@ -403,9 +410,10 @@ out:
|
||||
EXPORT_SYMBOL(mt76_testmode_cmd);
|
||||
|
||||
static int
|
||||
mt76_testmode_dump_stats(struct mt76_dev *dev, struct sk_buff *msg)
|
||||
mt76_testmode_dump_stats(struct mt76_phy *phy, struct sk_buff *msg)
|
||||
{
|
||||
struct mt76_testmode_data *td = &dev->test;
|
||||
struct mt76_testmode_data *td = &phy->test;
|
||||
struct mt76_dev *dev = phy->dev;
|
||||
u64 rx_packets = 0;
|
||||
u64 rx_fcs_error = 0;
|
||||
int i;
|
||||
@@ -425,7 +433,7 @@ mt76_testmode_dump_stats(struct mt76_dev *dev, struct sk_buff *msg)
|
||||
return -EMSGSIZE;
|
||||
|
||||
if (dev->test_ops->dump_stats)
|
||||
return dev->test_ops->dump_stats(dev, msg);
|
||||
return dev->test_ops->dump_stats(phy, msg);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -435,7 +443,7 @@ int mt76_testmode_dump(struct ieee80211_hw *hw, struct sk_buff *msg,
|
||||
{
|
||||
struct mt76_phy *phy = hw->priv;
|
||||
struct mt76_dev *dev = phy->dev;
|
||||
struct mt76_testmode_data *td = &dev->test;
|
||||
struct mt76_testmode_data *td = &phy->test;
|
||||
struct nlattr *tb[NUM_MT76_TM_ATTRS] = {};
|
||||
int err = 0;
|
||||
void *a;
|
||||
@@ -461,14 +469,14 @@ int mt76_testmode_dump(struct ieee80211_hw *hw, struct sk_buff *msg,
|
||||
|
||||
a = nla_nest_start(msg, MT76_TM_ATTR_STATS);
|
||||
if (a) {
|
||||
err = mt76_testmode_dump_stats(dev, msg);
|
||||
err = mt76_testmode_dump_stats(phy, msg);
|
||||
nla_nest_end(msg, a);
|
||||
}
|
||||
|
||||
goto out;
|
||||
}
|
||||
|
||||
mt76_testmode_init_defaults(dev);
|
||||
mt76_testmode_init_defaults(phy);
|
||||
|
||||
err = -EMSGSIZE;
|
||||
if (nla_put_u32(msg, MT76_TM_ATTR_STATE, td->state))
|
||||
|
||||
Reference in New Issue
Block a user