Commit 4c683607 authored by Jes Sorensen's avatar Jes Sorensen Committed by Kalle Valo

rtl8xxxu: Improve handling of txdesc32 vs txdesc40 handling

Further correct the handling of 40 byte TX descriptors.
Signed-off-by: default avatarJes Sorensen <Jes.Sorensen@redhat.com>
Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
parent 2c6670b2
...@@ -7018,15 +7018,6 @@ static void rtl8xxxu_tx(struct ieee80211_hw *hw, ...@@ -7018,15 +7018,6 @@ static void rtl8xxxu_tx(struct ieee80211_hw *hw,
} }
} }
if (rate_flag & IEEE80211_TX_RC_MCS)
rate = tx_info->control.rates[0].idx + DESC_RATE_MCS0;
else
rate = tx_rate->hw_value;
tx_desc->txdw5 = cpu_to_le32(rate);
if (ieee80211_is_data(hdr->frame_control))
tx_desc->txdw5 |= cpu_to_le32(0x0001ff00);
/* (tx_info->flags & IEEE80211_TX_CTL_AMPDU) && */ /* (tx_info->flags & IEEE80211_TX_CTL_AMPDU) && */
ampdu_enable = false; ampdu_enable = false;
if (ieee80211_is_data_qos(hdr->frame_control) && sta) { if (ieee80211_is_data_qos(hdr->frame_control) && sta) {
...@@ -7041,8 +7032,18 @@ static void rtl8xxxu_tx(struct ieee80211_hw *hw, ...@@ -7041,8 +7032,18 @@ static void rtl8xxxu_tx(struct ieee80211_hw *hw,
} }
} }
if (rate_flag & IEEE80211_TX_RC_MCS)
rate = tx_info->control.rates[0].idx + DESC_RATE_MCS0;
else
rate = tx_rate->hw_value;
seq_number = IEEE80211_SEQ_TO_SN(le16_to_cpu(hdr->seq_ctrl)); seq_number = IEEE80211_SEQ_TO_SN(le16_to_cpu(hdr->seq_ctrl));
if (!usedesc40) { if (!usedesc40) {
tx_desc->txdw5 = cpu_to_le32(rate);
if (ieee80211_is_data(hdr->frame_control))
tx_desc->txdw5 |= cpu_to_le32(0x0001ff00);
tx_desc->txdw3 = tx_desc->txdw3 =
cpu_to_le32((u32)seq_number << TXDESC_SEQ_SHIFT_8723A); cpu_to_le32((u32)seq_number << TXDESC_SEQ_SHIFT_8723A);
...@@ -7050,9 +7051,56 @@ static void rtl8xxxu_tx(struct ieee80211_hw *hw, ...@@ -7050,9 +7051,56 @@ static void rtl8xxxu_tx(struct ieee80211_hw *hw,
tx_desc->txdw1 |= cpu_to_le32(TXDESC_AGG_ENABLE_8723A); tx_desc->txdw1 |= cpu_to_le32(TXDESC_AGG_ENABLE_8723A);
else else
tx_desc->txdw1 |= cpu_to_le32(TXDESC_AGG_BREAK_8723A); tx_desc->txdw1 |= cpu_to_le32(TXDESC_AGG_BREAK_8723A);
if (ieee80211_is_mgmt(hdr->frame_control)) {
tx_desc->txdw5 = cpu_to_le32(tx_rate->hw_value);
tx_desc->txdw4 |=
cpu_to_le32(TXDESC_USE_DRIVER_RATE_8723A);
tx_desc->txdw5 |=
cpu_to_le32(6 <<
TXDESC_RETRY_LIMIT_SHIFT_8723A);
tx_desc->txdw5 |=
cpu_to_le32(TXDESC_RETRY_LIMIT_ENABLE_8723A);
}
if (ieee80211_is_data_qos(hdr->frame_control))
tx_desc->txdw4 |= cpu_to_le32(TXDESC_QOS_8723A);
if (rate_flag & IEEE80211_TX_RC_USE_SHORT_PREAMBLE ||
(sta && vif && vif->bss_conf.use_short_preamble))
tx_desc->txdw4 |=
cpu_to_le32(TXDESC_SHORT_PREAMBLE_8723A);
if (rate_flag & IEEE80211_TX_RC_SHORT_GI ||
(ieee80211_is_data_qos(hdr->frame_control) &&
sta && sta->ht_cap.cap &
(IEEE80211_HT_CAP_SGI_40 | IEEE80211_HT_CAP_SGI_20))) {
tx_desc->txdw5 |= cpu_to_le32(TXDESC_SHORT_GI);
}
if (rate_flag & IEEE80211_TX_RC_USE_RTS_CTS) {
/*
* Use RTS rate 24M - does the mac80211 tell
* us which to use?
*/
tx_desc->txdw4 |=
cpu_to_le32(DESC_RATE_24M <<
TXDESC_RTS_RATE_SHIFT_8723A);
tx_desc->txdw4 |=
cpu_to_le32(TXDESC_RTS_CTS_ENABLE_8723A);
tx_desc->txdw4 |=
cpu_to_le32(TXDESC_HW_RTS_ENABLE_8723A);
}
} else { } else {
tx_desc40 = (struct rtl8723bu_tx_desc *)tx_desc; tx_desc40 = (struct rtl8723bu_tx_desc *)tx_desc;
tx_desc40->txdw4 = cpu_to_le32(rate);
if (ieee80211_is_data(hdr->frame_control)) {
tx_desc->txdw4 |=
cpu_to_le32(0x1f <<
TXDESC_DATA_RATE_FB_SHIFT_8723B);
}
tx_desc40->txdw9 = tx_desc40->txdw9 =
cpu_to_le32((u32)seq_number << TXDESC_SEQ_SHIFT_8723B); cpu_to_le32((u32)seq_number << TXDESC_SEQ_SHIFT_8723B);
...@@ -7061,34 +7109,37 @@ static void rtl8xxxu_tx(struct ieee80211_hw *hw, ...@@ -7061,34 +7109,37 @@ static void rtl8xxxu_tx(struct ieee80211_hw *hw,
cpu_to_le32(TXDESC_AGG_ENABLE_8723B); cpu_to_le32(TXDESC_AGG_ENABLE_8723B);
else else
tx_desc40->txdw2 |= cpu_to_le32(TXDESC_AGG_BREAK_8723B); tx_desc40->txdw2 |= cpu_to_le32(TXDESC_AGG_BREAK_8723B);
};
if (ieee80211_is_data_qos(hdr->frame_control)) if (ieee80211_is_mgmt(hdr->frame_control)) {
tx_desc->txdw4 |= cpu_to_le32(TXDESC_QOS); tx_desc40->txdw4 = cpu_to_le32(tx_rate->hw_value);
if (rate_flag & IEEE80211_TX_RC_USE_SHORT_PREAMBLE || tx_desc40->txdw3 |=
(sta && vif && vif->bss_conf.use_short_preamble)) cpu_to_le32(TXDESC_USE_DRIVER_RATE_8723B);
tx_desc->txdw4 |= cpu_to_le32(TXDESC_SHORT_PREAMBLE); tx_desc40->txdw4 |=
if (rate_flag & IEEE80211_TX_RC_SHORT_GI || cpu_to_le32(6 <<
(ieee80211_is_data_qos(hdr->frame_control) && TXDESC_RETRY_LIMIT_SHIFT_8723B);
sta && sta->ht_cap.cap & tx_desc40->txdw4 |=
(IEEE80211_HT_CAP_SGI_40 | IEEE80211_HT_CAP_SGI_20))) { cpu_to_le32(TXDESC_RETRY_LIMIT_ENABLE_8723B);
tx_desc->txdw5 |= cpu_to_le32(TXDESC_SHORT_GI); }
}
if (ieee80211_is_mgmt(hdr->frame_control)) { if (rate_flag & IEEE80211_TX_RC_USE_SHORT_PREAMBLE ||
tx_desc->txdw5 = cpu_to_le32(tx_rate->hw_value); (sta && vif && vif->bss_conf.use_short_preamble))
tx_desc->txdw4 |= cpu_to_le32(TXDESC_USE_DRIVER_RATE_8723A); tx_desc40->txdw5 |=
tx_desc->txdw5 |= cpu_to_le32(TXDESC_SHORT_PREAMBLE_8723B);
cpu_to_le32(6 << TXDESC_RETRY_LIMIT_SHIFT_8723A);
tx_desc->txdw5 |= cpu_to_le32(TXDESC_RETRY_LIMIT_ENABLE_8723A); if (rate_flag & IEEE80211_TX_RC_USE_RTS_CTS) {
} /*
* Use RTS rate 24M - does the mac80211 tell
if (rate_flag & IEEE80211_TX_RC_USE_RTS_CTS) { * us which to use?
/* Use RTS rate 24M - does the mac80211 tell us which to use? */ */
tx_desc->txdw4 |= cpu_to_le32(DESC_RATE_24M << tx_desc->txdw4 |=
TXDESC_RTS_RATE_SHIFT_8723A); cpu_to_le32(DESC_RATE_24M <<
tx_desc->txdw4 |= cpu_to_le32(TXDESC_RTS_CTS_ENABLE_8723A); TXDESC_RTS_RATE_SHIFT_8723B);
tx_desc->txdw4 |= cpu_to_le32(TXDESC_HW_RTS_ENABLE_8723A); tx_desc->txdw3 |=
} cpu_to_le32(TXDESC_RTS_CTS_ENABLE_8723B);
tx_desc->txdw3 |=
cpu_to_le32(TXDESC_HW_RTS_ENABLE_8723B);
}
};
rtl8xxxu_calc_tx_desc_csum(tx_desc); rtl8xxxu_calc_tx_desc_csum(tx_desc);
......
...@@ -477,7 +477,7 @@ struct rtl8723bu_tx_desc { ...@@ -477,7 +477,7 @@ struct rtl8723bu_tx_desc {
/* Word 4 */ /* Word 4 */
#define TXDESC_RTS_RATE_SHIFT_8723A 0 #define TXDESC_RTS_RATE_SHIFT_8723A 0
#define TXDESC_RTS_RATE_MASK_8723A 0x3f #define TXDESC_RTS_RATE_MASK_8723A 0x3f
#define TXDESC_QOS BIT(6) #define TXDESC_QOS_8723A BIT(6)
#define TXDESC_HW_SEQ_ENABLE_8723A BIT(7) #define TXDESC_HW_SEQ_ENABLE_8723A BIT(7)
#define TXDESC_USE_DRIVER_RATE_8723A BIT(8) #define TXDESC_USE_DRIVER_RATE_8723A BIT(8)
#define TXDESC_DISABLE_DATA_FB BIT(10) #define TXDESC_DISABLE_DATA_FB BIT(10)
...@@ -486,11 +486,13 @@ struct rtl8723bu_tx_desc { ...@@ -486,11 +486,13 @@ struct rtl8723bu_tx_desc {
#define TXDESC_HW_RTS_ENABLE_8723A BIT(13) #define TXDESC_HW_RTS_ENABLE_8723A BIT(13)
#define TXDESC_PRIME_CH_OFF_LOWER BIT(20) #define TXDESC_PRIME_CH_OFF_LOWER BIT(20)
#define TXDESC_PRIME_CH_OFF_UPPER BIT(21) #define TXDESC_PRIME_CH_OFF_UPPER BIT(21)
#define TXDESC_SHORT_PREAMBLE BIT(24) #define TXDESC_SHORT_PREAMBLE_8723A BIT(24)
#define TXDESC_DATA_BW BIT(25) #define TXDESC_DATA_BW BIT(25)
#define TXDESC_RTS_DATA_BW BIT(27) #define TXDESC_RTS_DATA_BW BIT(27)
#define TXDESC_RTS_PRIME_CH_OFF_LOWER BIT(28) #define TXDESC_RTS_PRIME_CH_OFF_LOWER BIT(28)
#define TXDESC_RTS_PRIME_CH_OFF_UPPER BIT(29) #define TXDESC_RTS_PRIME_CH_OFF_UPPER BIT(29)
#define TXDESC_DATA_RATE_FB_SHIFT_8723B 8
#define TXDESC_DATA_RATE_FB_MASK_8723B 0x00001f00
#define TXDESC_RETRY_LIMIT_ENABLE_8723B BIT(17) #define TXDESC_RETRY_LIMIT_ENABLE_8723B BIT(17)
#define TXDESC_RETRY_LIMIT_SHIFT_8723B 18 #define TXDESC_RETRY_LIMIT_SHIFT_8723B 18
#define TXDESC_RETRY_LIMIT_MASK_8723B 0x00fc0000 #define TXDESC_RETRY_LIMIT_MASK_8723B 0x00fc0000
...@@ -498,6 +500,7 @@ struct rtl8723bu_tx_desc { ...@@ -498,6 +500,7 @@ struct rtl8723bu_tx_desc {
#define TXDESC_RTS_RATE_MASK_8723B 0x3f000000 #define TXDESC_RTS_RATE_MASK_8723B 0x3f000000
/* Word 5 */ /* Word 5 */
#define TXDESC_SHORT_PREAMBLE_8723B BIT(4)
#define TXDESC_SHORT_GI BIT(6) #define TXDESC_SHORT_GI BIT(6)
#define TXDESC_CCX_TAG BIT(7) #define TXDESC_CCX_TAG BIT(7)
#define TXDESC_RETRY_LIMIT_ENABLE_8723A BIT(17) #define TXDESC_RETRY_LIMIT_ENABLE_8723A BIT(17)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment