rtw88: allows to set RTS in TX descriptor
Allows driver to send RTS by filling tx descriptor. The user may want to set the rts threshold. But since we have not been taking over rate control from mac80211 to driver by setting flag IEEE80211_HW_HAS_RATE_CONTROL, there is nothing we can do about it. So here just store the value, and mac80211 will tell us to use rts protection by ieee80211_tx_info::control::use_rts. Signed-off-by: Yan-Hsuan Chuang <yhchuang@realtek.com> Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
This commit is contained in:
parent
3a2dd6b7ca
commit
942e2a5d39
@ -541,6 +541,17 @@ static void rtw_ops_mgd_prepare_tx(struct ieee80211_hw *hw,
|
||||
mutex_unlock(&rtwdev->mutex);
|
||||
}
|
||||
|
||||
static int rtw_ops_set_rts_threshold(struct ieee80211_hw *hw, u32 value)
|
||||
{
|
||||
struct rtw_dev *rtwdev = hw->priv;
|
||||
|
||||
mutex_lock(&rtwdev->mutex);
|
||||
rtwdev->rts_threshold = value;
|
||||
mutex_unlock(&rtwdev->mutex);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
const struct ieee80211_ops rtw_ops = {
|
||||
.tx = rtw_ops_tx,
|
||||
.start = rtw_ops_start,
|
||||
@ -557,5 +568,6 @@ const struct ieee80211_ops rtw_ops = {
|
||||
.sw_scan_start = rtw_ops_sw_scan_start,
|
||||
.sw_scan_complete = rtw_ops_sw_scan_complete,
|
||||
.mgd_prepare_tx = rtw_ops_mgd_prepare_tx,
|
||||
.set_rts_threshold = rtw_ops_set_rts_threshold,
|
||||
};
|
||||
EXPORT_SYMBOL(rtw_ops);
|
||||
|
@ -484,6 +484,7 @@ struct rtw_tx_pkt_info {
|
||||
bool fs;
|
||||
bool short_gi;
|
||||
bool report;
|
||||
bool rts;
|
||||
};
|
||||
|
||||
struct rtw_rx_pkt_stat {
|
||||
@ -1377,6 +1378,7 @@ struct rtw_dev {
|
||||
struct dentry *debugfs;
|
||||
|
||||
u8 sta_cnt;
|
||||
u32 rts_threshold;
|
||||
|
||||
DECLARE_BITMAP(mac_id_map, RTW_MAX_MAC_ID_NUM);
|
||||
DECLARE_BITMAP(flags, NUM_OF_RTW_FLAGS);
|
||||
|
@ -56,6 +56,7 @@ void rtw_tx_fill_tx_desc(struct rtw_tx_pkt_info *pkt_info, struct sk_buff *skb)
|
||||
SET_TX_DESC_DATA_SHORT(txdesc, pkt_info->short_gi);
|
||||
SET_TX_DESC_SPE_RPT(txdesc, pkt_info->report);
|
||||
SET_TX_DESC_SW_DEFINE(txdesc, pkt_info->sn);
|
||||
SET_TX_DESC_USE_RTS(txdesc, pkt_info->rts);
|
||||
}
|
||||
EXPORT_SYMBOL(rtw_tx_fill_tx_desc);
|
||||
|
||||
@ -258,6 +259,9 @@ static void rtw_tx_data_pkt_info_update(struct rtw_dev *rtwdev,
|
||||
ampdu_density = get_tx_ampdu_density(sta);
|
||||
}
|
||||
|
||||
if (info->control.use_rts)
|
||||
pkt_info->rts = true;
|
||||
|
||||
if (sta->vht_cap.vht_supported)
|
||||
rate = get_highest_vht_tx_rate(rtwdev, sta);
|
||||
else if (sta->ht_cap.ht_supported)
|
||||
|
@ -35,6 +35,8 @@
|
||||
le32p_replace_bits((__le32 *)(txdesc) + 0x09, value, GENMASK(23, 12))
|
||||
#define SET_TX_DESC_MAX_AGG_NUM(txdesc, value) \
|
||||
le32p_replace_bits((__le32 *)(txdesc) + 0x03, value, GENMASK(21, 17))
|
||||
#define SET_TX_DESC_USE_RTS(tx_desc, value) \
|
||||
le32p_replace_bits((__le32 *)(txdesc) + 0x03, value, BIT(12))
|
||||
#define SET_TX_DESC_AMPDU_DENSITY(txdesc, value) \
|
||||
le32p_replace_bits((__le32 *)(txdesc) + 0x02, value, GENMASK(22, 20))
|
||||
#define SET_TX_DESC_DATA_STBC(txdesc, value) \
|
||||
|
Loading…
x
Reference in New Issue
Block a user