rtw89: set mac_id and port ID to TXWD
One mac_id is corresponding to one connected station, and port ID is a ID of virtual interfaces. With proper mac_id and port ID, firmware and hardware can handle a packet with correct context. Signed-off-by: Ping-Ke Shih <pkshih@realtek.com> Signed-off-by: Kalle Valo <kvalo@kernel.org> Link: https://lore.kernel.org/r/20220107034239.22002-12-pkshih@realtek.com
This commit is contained in:
Родитель
11d261f24b
Коммит
9eecaec238
|
@ -377,6 +377,8 @@ static void
|
|||
rtw89_core_tx_update_mgmt_info(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_core_tx_request *tx_req)
|
||||
{
|
||||
struct ieee80211_vif *vif = tx_req->vif;
|
||||
struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv;
|
||||
struct rtw89_tx_desc_info *desc_info = &tx_req->desc_info;
|
||||
u8 qsel, ch_dma;
|
||||
|
||||
|
@ -385,6 +387,7 @@ rtw89_core_tx_update_mgmt_info(struct rtw89_dev *rtwdev,
|
|||
|
||||
desc_info->qsel = qsel;
|
||||
desc_info->ch_dma = ch_dma;
|
||||
desc_info->port = desc_info->hiq ? rtwvif->port : 0;
|
||||
desc_info->hw_ssn_sel = RTW89_MGMT_HW_SSN_SEL;
|
||||
desc_info->hw_seq_mode = RTW89_MGMT_HW_SEQ_MODE;
|
||||
|
||||
|
@ -522,6 +525,21 @@ desc_bk:
|
|||
desc_info->bk = true;
|
||||
}
|
||||
|
||||
static u8 rtw89_core_tx_get_mac_id(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_core_tx_request *tx_req)
|
||||
{
|
||||
struct ieee80211_vif *vif = tx_req->vif;
|
||||
struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv;
|
||||
struct ieee80211_sta *sta = tx_req->sta;
|
||||
struct rtw89_sta *rtwsta;
|
||||
|
||||
if (!sta)
|
||||
return rtwvif->mac_id;
|
||||
|
||||
rtwsta = (struct rtw89_sta *)sta->drv_priv;
|
||||
return rtwsta->mac_id;
|
||||
}
|
||||
|
||||
static void
|
||||
rtw89_core_tx_update_data_info(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_core_tx_request *tx_req)
|
||||
|
@ -543,6 +561,8 @@ rtw89_core_tx_update_data_info(struct rtw89_dev *rtwdev,
|
|||
desc_info->ch_dma = ch_dma;
|
||||
desc_info->tid_indicate = tid_indicate;
|
||||
desc_info->qsel = qsel;
|
||||
desc_info->mac_id = rtw89_core_tx_get_mac_id(rtwdev, tx_req);
|
||||
desc_info->port = desc_info->hiq ? rtwvif->port : 0;
|
||||
|
||||
/* enable wd_info for AMPDU */
|
||||
desc_info->en_wd_info = true;
|
||||
|
@ -725,7 +745,8 @@ static __le32 rtw89_build_txwd_body2(struct rtw89_tx_desc_info *desc_info)
|
|||
{
|
||||
u32 dword = FIELD_PREP(RTW89_TXWD_BODY2_TID_INDICATE, desc_info->tid_indicate) |
|
||||
FIELD_PREP(RTW89_TXWD_BODY2_QSEL, desc_info->qsel) |
|
||||
FIELD_PREP(RTW89_TXWD_BODY2_TXPKT_SIZE, desc_info->pkt_size);
|
||||
FIELD_PREP(RTW89_TXWD_BODY2_TXPKT_SIZE, desc_info->pkt_size) |
|
||||
FIELD_PREP(RTW89_TXWD_BODY2_MACID, desc_info->mac_id);
|
||||
|
||||
return cpu_to_le32(dword);
|
||||
}
|
||||
|
@ -743,7 +764,8 @@ static __le32 rtw89_build_txwd_info0(struct rtw89_tx_desc_info *desc_info)
|
|||
{
|
||||
u32 dword = FIELD_PREP(RTW89_TXWD_INFO0_USE_RATE, desc_info->use_rate) |
|
||||
FIELD_PREP(RTW89_TXWD_INFO0_DATA_RATE, desc_info->data_rate) |
|
||||
FIELD_PREP(RTW89_TXWD_INFO0_DISDATAFB, desc_info->dis_data_fb);
|
||||
FIELD_PREP(RTW89_TXWD_INFO0_DISDATAFB, desc_info->dis_data_fb) |
|
||||
FIELD_PREP(RTW89_TXWD_INFO0_MULTIPORT_ID, desc_info->port);
|
||||
|
||||
return cpu_to_le32(dword);
|
||||
}
|
||||
|
|
|
@ -665,6 +665,7 @@ struct rtw89_rxdesc_long {
|
|||
struct rtw89_tx_desc_info {
|
||||
u16 pkt_size;
|
||||
u8 wp_offset;
|
||||
u8 mac_id;
|
||||
u8 qsel;
|
||||
u8 ch_dma;
|
||||
u8 hdr_llc_len;
|
||||
|
@ -691,6 +692,7 @@ struct rtw89_tx_desc_info {
|
|||
u8 hw_seq_mode;
|
||||
#define RTW89_MGMT_HW_SEQ_MODE 1
|
||||
bool hiq;
|
||||
u8 port;
|
||||
};
|
||||
|
||||
struct rtw89_core_tx_request {
|
||||
|
|
|
@ -58,6 +58,7 @@
|
|||
#define RTW89_TXWD_INFO0_GI_LTF GENMASK(27, 25)
|
||||
#define RTW89_TXWD_INFO0_DATA_RATE GENMASK(24, 16)
|
||||
#define RTW89_TXWD_INFO0_DISDATAFB BIT(10)
|
||||
#define RTW89_TXWD_INFO0_MULTIPORT_ID GENMASK(6, 4)
|
||||
|
||||
/* TX WD INFO DWORD 1 */
|
||||
#define RTW89_TXWD_INFO1_DATA_RTY_LOWEST_RATE GENMASK(24, 16)
|
||||
|
|
Загрузка…
Ссылка в новой задаче