mirror of https://gitee.com/openkylin/linux.git
mt76: mt7915: set peer Tx fixed rate through debugfs
Driver can manually set fixed rate for each peer through debugfs. May use .set_bitrate_mask callback and iterate stations under the current vif to achieve the aim once it supports HE rate. Signed-off-by: Ryder Lee <ryder.lee@mediatek.com> Signed-off-by: Shayne Chen <shayne.chen@mediatek.com> Signed-off-by: Felix Fietkau <nbd@nbd.name>
This commit is contained in:
parent
b02eafae42
commit
9fac3c81ee
|
@ -305,6 +305,18 @@ int mt7915_init_debugfs(struct mt7915_dev *dev)
|
|||
|
||||
/** per-station debugfs **/
|
||||
|
||||
/* usage: <tx mode> <ldpc> <stbc> <bw> <gi> <nss> <mcs> */
|
||||
static int mt7915_sta_fixed_rate_set(void *data, u64 rate)
|
||||
{
|
||||
struct ieee80211_sta *sta = data;
|
||||
struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
|
||||
|
||||
return mt7915_mcu_set_fixed_rate(msta->vif->dev, sta, rate);
|
||||
}
|
||||
|
||||
DEFINE_DEBUGFS_ATTRIBUTE(fops_fixed_rate, NULL,
|
||||
mt7915_sta_fixed_rate_set, "%llx\n");
|
||||
|
||||
static int
|
||||
mt7915_sta_stats_read(struct seq_file *s, void *data)
|
||||
{
|
||||
|
@ -365,5 +377,6 @@ static const struct file_operations fops_sta_stats = {
|
|||
void mt7915_sta_add_debugfs(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
|
||||
struct ieee80211_sta *sta, struct dentry *dir)
|
||||
{
|
||||
debugfs_create_file("fixed_rate", 0600, dir, sta, &fops_fixed_rate);
|
||||
debugfs_create_file("stats", 0400, dir, sta, &fops_sta_stats);
|
||||
}
|
||||
|
|
|
@ -1735,6 +1735,52 @@ int mt7915_mcu_add_sta(struct mt7915_dev *dev, struct ieee80211_vif *vif,
|
|||
return 0;
|
||||
}
|
||||
|
||||
int mt7915_mcu_set_fixed_rate(struct mt7915_dev *dev,
|
||||
struct ieee80211_sta *sta, u32 rate)
|
||||
{
|
||||
struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
|
||||
struct mt7915_vif *mvif = msta->vif;
|
||||
struct sta_rec_ra_fixed *ra;
|
||||
struct sk_buff *skb;
|
||||
struct tlv *tlv;
|
||||
|
||||
skb = mt7915_mcu_alloc_sta_req(dev, mvif, msta,
|
||||
MT7915_STA_UPDATE_MAX_SIZE);
|
||||
if (IS_ERR(skb))
|
||||
return PTR_ERR(skb);
|
||||
|
||||
tlv = mt7915_mcu_add_tlv(skb, STA_REC_RA_UPDATE, sizeof(*ra));
|
||||
ra = (struct sta_rec_ra_fixed *)tlv;
|
||||
|
||||
if (!rate) {
|
||||
ra->field = cpu_to_le32(RATE_PARAM_AUTO);
|
||||
goto out;
|
||||
} else {
|
||||
ra->field = cpu_to_le32(RATE_PARAM_FIXED);
|
||||
}
|
||||
|
||||
ra->phy.type = FIELD_GET(RATE_CFG_PHY_TYPE, rate);
|
||||
ra->phy.bw = FIELD_GET(RATE_CFG_BW, rate);
|
||||
ra->phy.nss = FIELD_GET(RATE_CFG_NSS, rate);
|
||||
ra->phy.mcs = FIELD_GET(RATE_CFG_MCS, rate);
|
||||
ra->phy.stbc = FIELD_GET(RATE_CFG_STBC, rate);
|
||||
|
||||
if (ra->phy.bw)
|
||||
ra->phy.ldpc = 7;
|
||||
else
|
||||
ra->phy.ldpc = FIELD_GET(RATE_CFG_LDPC, rate) * 7;
|
||||
|
||||
/* HT/VHT - SGI: 1, LGI: 0; HE - SGI: 0, MGI: 1, LGI: 2 */
|
||||
if (ra->phy.type > MT_PHY_TYPE_VHT)
|
||||
ra->phy.sgi = ra->phy.mcs * 85;
|
||||
else
|
||||
ra->phy.sgi = ra->phy.mcs * 15;
|
||||
|
||||
out:
|
||||
return __mt76_mcu_skb_send_msg(&dev->mt76, skb,
|
||||
MCU_EXT_CMD_STA_REC_UPDATE, true);
|
||||
}
|
||||
|
||||
int mt7915_mcu_add_dev_info(struct mt7915_dev *dev,
|
||||
struct ieee80211_vif *vif, bool enable)
|
||||
{
|
||||
|
|
|
@ -803,6 +803,34 @@ struct sta_rec_ra {
|
|||
struct ra_phy phy;
|
||||
} __packed;
|
||||
|
||||
struct sta_rec_ra_fixed {
|
||||
__le16 tag;
|
||||
__le16 len;
|
||||
|
||||
__le32 field;
|
||||
u8 op_mode;
|
||||
u8 op_vht_chan_width;
|
||||
u8 op_vht_rx_nss;
|
||||
u8 op_vht_rx_nss_type;
|
||||
|
||||
struct ra_phy phy;
|
||||
|
||||
u8 spe_en;
|
||||
u8 short_preamble;
|
||||
u8 is_5g;
|
||||
u8 mmps_mode;
|
||||
} __packed;
|
||||
|
||||
#define RATE_PARAM_FIXED 3
|
||||
#define RATE_PARAM_AUTO 20
|
||||
#define RATE_CFG_MCS GENMASK(3, 0)
|
||||
#define RATE_CFG_NSS GENMASK(7, 4)
|
||||
#define RATE_CFG_GI GENMASK(11, 8)
|
||||
#define RATE_CFG_BW GENMASK(15, 12)
|
||||
#define RATE_CFG_STBC GENMASK(19, 16)
|
||||
#define RATE_CFG_LDPC GENMASK(23, 20)
|
||||
#define RATE_CFG_PHY_TYPE GENMASK(27, 24)
|
||||
|
||||
enum {
|
||||
STA_REC_BASIC,
|
||||
STA_REC_RA,
|
||||
|
|
|
@ -303,6 +303,8 @@ int mt7915_mcu_add_smps(struct mt7915_dev *dev, struct ieee80211_vif *vif,
|
|||
struct ieee80211_sta *sta);
|
||||
int mt7915_mcu_set_chan_info(struct mt7915_phy *phy, int cmd);
|
||||
int mt7915_mcu_set_tx(struct mt7915_dev *dev, struct ieee80211_vif *vif);
|
||||
int mt7915_mcu_set_fixed_rate(struct mt7915_dev *dev,
|
||||
struct ieee80211_sta *sta, u32 rate);
|
||||
int mt7915_mcu_set_eeprom(struct mt7915_dev *dev);
|
||||
int mt7915_mcu_get_eeprom(struct mt7915_dev *dev, u32 offset);
|
||||
int mt7915_mcu_set_mac(struct mt7915_dev *dev, int band, bool enable,
|
||||
|
|
Loading…
Reference in New Issue