mt76: add support for setting mcast rate
Mesh and ad-hoc interfaces allow users to set mcast rate through NL80211_ATTR_MCAST_RATE, so rework mt76_default_basic_rate() to adapt that. Signed-off-by: Ryder Lee <ryder.lee@mediatek.com> Signed-off-by: Felix Fietkau <nbd@nbd.name>
This commit is contained in:
Родитель
47f1c08db7
Коммит
33920b2bf0
|
@ -1352,16 +1352,20 @@ mt76_init_queue(struct mt76_dev *dev, int qid, int idx, int n_desc,
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(mt76_init_queue);
|
||||
|
||||
u16 mt76_default_basic_rate(struct mt76_phy *phy, struct ieee80211_vif *vif)
|
||||
u16 mt76_calculate_default_rate(struct mt76_phy *phy, int rateidx)
|
||||
{
|
||||
int i = ffs(vif->bss_conf.basic_rates) - 1, offset = 0;
|
||||
int offset = 0;
|
||||
struct ieee80211_rate *rate;
|
||||
|
||||
if (phy->chandef.chan->band == NL80211_BAND_5GHZ)
|
||||
offset = 4;
|
||||
|
||||
rate = &mt76_rates[offset + i];
|
||||
/* pick the lowest rate for hidden nodes */
|
||||
if (rateidx < 0)
|
||||
rateidx = 0;
|
||||
|
||||
rate = &mt76_rates[offset + rateidx];
|
||||
|
||||
return rate->hw_value;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(mt76_default_basic_rate);
|
||||
EXPORT_SYMBOL_GPL(mt76_calculate_default_rate);
|
||||
|
|
|
@ -891,7 +891,7 @@ int mt76_get_of_eeprom(struct mt76_dev *dev, void *data, int offset, int len);
|
|||
struct mt76_queue *
|
||||
mt76_init_queue(struct mt76_dev *dev, int qid, int idx, int n_desc,
|
||||
int ring_base);
|
||||
u16 mt76_default_basic_rate(struct mt76_phy *phy, struct ieee80211_vif *vif);
|
||||
u16 mt76_calculate_default_rate(struct mt76_phy *phy, int rateidx);
|
||||
static inline int mt76_init_tx_queue(struct mt76_phy *phy, int qid, int idx,
|
||||
int n_desc, int ring_base)
|
||||
{
|
||||
|
|
|
@ -904,17 +904,19 @@ mt7915_mac_write_txwi_8023(struct mt7915_dev *dev, __le32 *txwi,
|
|||
|
||||
static void
|
||||
mt7915_mac_write_txwi_80211(struct mt7915_dev *dev, __le32 *txwi,
|
||||
struct sk_buff *skb, struct ieee80211_key_conf *key)
|
||||
struct sk_buff *skb, struct ieee80211_key_conf *key,
|
||||
bool *mcast)
|
||||
{
|
||||
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
|
||||
struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *)skb->data;
|
||||
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
|
||||
bool multicast = is_multicast_ether_addr(hdr->addr1);
|
||||
u8 tid = skb->priority & IEEE80211_QOS_CTL_TID_MASK;
|
||||
__le16 fc = hdr->frame_control;
|
||||
u8 fc_type, fc_stype;
|
||||
u32 val;
|
||||
|
||||
*mcast = is_multicast_ether_addr(hdr->addr1);
|
||||
|
||||
if (ieee80211_is_action(fc) &&
|
||||
mgmt->u.action.category == WLAN_CATEGORY_BACK &&
|
||||
mgmt->u.action.u.addba_req.action_code == WLAN_ACTION_ADDBA_REQ) {
|
||||
|
@ -940,15 +942,15 @@ mt7915_mac_write_txwi_80211(struct mt7915_dev *dev, __le32 *txwi,
|
|||
|
||||
val = FIELD_PREP(MT_TXD2_FRAME_TYPE, fc_type) |
|
||||
FIELD_PREP(MT_TXD2_SUB_TYPE, fc_stype) |
|
||||
FIELD_PREP(MT_TXD2_MULTICAST, multicast);
|
||||
FIELD_PREP(MT_TXD2_MULTICAST, *mcast);
|
||||
|
||||
if (key && multicast && ieee80211_is_robust_mgmt_frame(skb) &&
|
||||
if (key && *mcast && ieee80211_is_robust_mgmt_frame(skb) &&
|
||||
key->cipher == WLAN_CIPHER_SUITE_AES_CMAC) {
|
||||
val |= MT_TXD2_BIP;
|
||||
txwi[3] &= ~cpu_to_le32(MT_TXD3_PROTECT_FRAME);
|
||||
}
|
||||
|
||||
if (!ieee80211_is_data(fc) || multicast ||
|
||||
if (!ieee80211_is_data(fc) || *mcast ||
|
||||
info->flags & IEEE80211_TX_CTL_USE_MINRATE)
|
||||
val |= MT_TXD2_FIX_RATE;
|
||||
|
||||
|
@ -989,6 +991,7 @@ void mt7915_mac_write_txwi(struct mt7915_dev *dev, __le32 *txwi,
|
|||
bool ext_phy = info->hw_queue & MT_TX_HW_QUEUE_EXT_PHY;
|
||||
u8 p_fmt, q_idx, omac_idx = 0, wmm_idx = 0;
|
||||
bool is_8023 = info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP;
|
||||
bool mcast = false;
|
||||
u16 tx_count = 15;
|
||||
u32 val;
|
||||
|
||||
|
@ -1051,15 +1054,22 @@ void mt7915_mac_write_txwi(struct mt7915_dev *dev, __le32 *txwi,
|
|||
if (is_8023)
|
||||
mt7915_mac_write_txwi_8023(dev, txwi, skb, wcid);
|
||||
else
|
||||
mt7915_mac_write_txwi_80211(dev, txwi, skb, key);
|
||||
mt7915_mac_write_txwi_80211(dev, txwi, skb, key, &mcast);
|
||||
|
||||
if (txwi[2] & cpu_to_le32(MT_TXD2_FIX_RATE)) {
|
||||
u8 band = mphy->chandef.chan->band;
|
||||
int rateidx, mcast_rate = vif->bss_conf.mcast_rate[band];
|
||||
u16 rate, mode;
|
||||
|
||||
/* hardware won't add HTC for mgmt/ctrl frame */
|
||||
txwi[2] |= cpu_to_le32(MT_TXD2_HTC_VLD);
|
||||
|
||||
rate = mt76_default_basic_rate(mphy, vif);
|
||||
if (mcast && mcast_rate > 0)
|
||||
rateidx = mcast_rate - 1;
|
||||
else
|
||||
rateidx = ffs(vif->bss_conf.basic_rates) - 1;
|
||||
|
||||
rate = mt76_calculate_default_rate(mphy, rateidx);
|
||||
mode = rate >> 8;
|
||||
rate &= GENMASK(7, 0);
|
||||
rate |= FIELD_PREP(MT_TX_RATE_MODE, mode);
|
||||
|
|
|
@ -812,12 +812,13 @@ void mt7921_mac_write_txwi(struct mt7921_dev *dev, __le32 *txwi,
|
|||
mt7921_mac_write_txwi_80211(dev, txwi, skb, key);
|
||||
|
||||
if (txwi[2] & cpu_to_le32(MT_TXD2_FIX_RATE)) {
|
||||
int rateidx = ffs(vif->bss_conf.basic_rates) - 1;
|
||||
u16 rate, mode;
|
||||
|
||||
/* hardware won't add HTC for mgmt/ctrl frame */
|
||||
txwi[2] |= cpu_to_le32(MT_TXD2_HTC_VLD);
|
||||
|
||||
rate = mt76_default_basic_rate(mphy, vif);
|
||||
rate = mt76_calculate_default_rate(mphy, rateidx);
|
||||
mode = rate >> 8;
|
||||
rate &= GENMASK(7, 0);
|
||||
rate |= FIELD_PREP(MT_TX_RATE_MODE, mode);
|
||||
|
|
Загрузка…
Ссылка в новой задаче