mirror of
https://github.com/raspberrypi/linux.git
synced 2025-12-06 10:00:17 +00:00
wifi: ath12k: Use msdu_end to check MCBC
We are seeing a very low TCP throughput testing with some specific tools. This is because for sub-frames of an AMSDU, MCBC flag in mpdu_start may be not valid, and as a result those frames would be dropped by kernel. Add a new helper to get it from msdu_end. Also clean up original helper since it is not needed any more. Tested-on: WCN7850 hw2.0 PCI WLAN.HMT.1.0-03427-QCAHMTSWPL_V1.0_V2.0_SILICONZ-1.15378.4 Signed-off-by: Baochen Qiang <quic_bqiang@quicinc.com> Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com> Link: https://lore.kernel.org/r/20230529081609.34567-1-quic_bqiang@quicinc.com
This commit is contained in:
committed by
Kalle Valo
parent
3394b51c7d
commit
8f04852e90
@@ -193,11 +193,11 @@ static void ath12k_dp_rxdesc_set_msdu_len(struct ath12k_base *ab,
|
|||||||
ab->hw_params->hal_ops->rx_desc_set_msdu_len(desc, len);
|
ab->hw_params->hal_ops->rx_desc_set_msdu_len(desc, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool ath12k_dp_rx_h_is_mcbc(struct ath12k_base *ab,
|
static bool ath12k_dp_rx_h_is_da_mcbc(struct ath12k_base *ab,
|
||||||
struct hal_rx_desc *desc)
|
struct hal_rx_desc *desc)
|
||||||
{
|
{
|
||||||
return (ath12k_dp_rx_h_first_msdu(ab, desc) &&
|
return (ath12k_dp_rx_h_first_msdu(ab, desc) &&
|
||||||
ab->hw_params->hal_ops->rx_desc_is_mcbc(desc));
|
ab->hw_params->hal_ops->rx_desc_is_da_mcbc(desc));
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool ath12k_dp_rxdesc_mac_addr2_valid(struct ath12k_base *ab,
|
static bool ath12k_dp_rxdesc_mac_addr2_valid(struct ath12k_base *ab,
|
||||||
@@ -2208,7 +2208,7 @@ static void ath12k_dp_rx_h_mpdu(struct ath12k *ar,
|
|||||||
|
|
||||||
/* PN for multicast packets will be checked in mac80211 */
|
/* PN for multicast packets will be checked in mac80211 */
|
||||||
rxcb = ATH12K_SKB_RXCB(msdu);
|
rxcb = ATH12K_SKB_RXCB(msdu);
|
||||||
fill_crypto_hdr = ath12k_dp_rx_h_is_mcbc(ar->ab, rx_desc);
|
fill_crypto_hdr = ath12k_dp_rx_h_is_da_mcbc(ar->ab, rx_desc);
|
||||||
rxcb->is_mcbc = fill_crypto_hdr;
|
rxcb->is_mcbc = fill_crypto_hdr;
|
||||||
|
|
||||||
if (rxcb->is_mcbc)
|
if (rxcb->is_mcbc)
|
||||||
|
|||||||
@@ -447,10 +447,10 @@ static u8 *ath12k_hw_qcn9274_rx_desc_mpdu_start_addr2(struct hal_rx_desc *desc)
|
|||||||
return desc->u.qcn9274.mpdu_start.addr2;
|
return desc->u.qcn9274.mpdu_start.addr2;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool ath12k_hw_qcn9274_rx_desc_is_mcbc(struct hal_rx_desc *desc)
|
static bool ath12k_hw_qcn9274_rx_desc_is_da_mcbc(struct hal_rx_desc *desc)
|
||||||
{
|
{
|
||||||
return __le32_to_cpu(desc->u.qcn9274.mpdu_start.info6) &
|
return __le16_to_cpu(desc->u.qcn9274.msdu_end.info5) &
|
||||||
RX_MPDU_START_INFO6_MCAST_BCAST;
|
RX_MSDU_END_INFO5_DA_IS_MCBC;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ath12k_hw_qcn9274_rx_desc_get_dot11_hdr(struct hal_rx_desc *desc,
|
static void ath12k_hw_qcn9274_rx_desc_get_dot11_hdr(struct hal_rx_desc *desc,
|
||||||
@@ -708,7 +708,7 @@ const struct hal_ops hal_qcn9274_ops = {
|
|||||||
.rx_desc_get_msdu_end_offset = ath12k_hw_qcn9274_rx_desc_get_msdu_end_offset,
|
.rx_desc_get_msdu_end_offset = ath12k_hw_qcn9274_rx_desc_get_msdu_end_offset,
|
||||||
.rx_desc_mac_addr2_valid = ath12k_hw_qcn9274_rx_desc_mac_addr2_valid,
|
.rx_desc_mac_addr2_valid = ath12k_hw_qcn9274_rx_desc_mac_addr2_valid,
|
||||||
.rx_desc_mpdu_start_addr2 = ath12k_hw_qcn9274_rx_desc_mpdu_start_addr2,
|
.rx_desc_mpdu_start_addr2 = ath12k_hw_qcn9274_rx_desc_mpdu_start_addr2,
|
||||||
.rx_desc_is_mcbc = ath12k_hw_qcn9274_rx_desc_is_mcbc,
|
.rx_desc_is_da_mcbc = ath12k_hw_qcn9274_rx_desc_is_da_mcbc,
|
||||||
.rx_desc_get_dot11_hdr = ath12k_hw_qcn9274_rx_desc_get_dot11_hdr,
|
.rx_desc_get_dot11_hdr = ath12k_hw_qcn9274_rx_desc_get_dot11_hdr,
|
||||||
.rx_desc_get_crypto_header = ath12k_hw_qcn9274_rx_desc_get_crypto_hdr,
|
.rx_desc_get_crypto_header = ath12k_hw_qcn9274_rx_desc_get_crypto_hdr,
|
||||||
.rx_desc_get_mpdu_frame_ctl = ath12k_hw_qcn9274_rx_desc_get_mpdu_frame_ctl,
|
.rx_desc_get_mpdu_frame_ctl = ath12k_hw_qcn9274_rx_desc_get_mpdu_frame_ctl,
|
||||||
@@ -887,10 +887,10 @@ static u8 *ath12k_hw_wcn7850_rx_desc_mpdu_start_addr2(struct hal_rx_desc *desc)
|
|||||||
return desc->u.wcn7850.mpdu_start.addr2;
|
return desc->u.wcn7850.mpdu_start.addr2;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool ath12k_hw_wcn7850_rx_desc_is_mcbc(struct hal_rx_desc *desc)
|
static bool ath12k_hw_wcn7850_rx_desc_is_da_mcbc(struct hal_rx_desc *desc)
|
||||||
{
|
{
|
||||||
return __le32_to_cpu(desc->u.wcn7850.mpdu_start.info6) &
|
return __le16_to_cpu(desc->u.wcn7850.msdu_end.info5) &
|
||||||
RX_MPDU_START_INFO6_MCAST_BCAST;
|
RX_MSDU_END_INFO5_DA_IS_MCBC;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ath12k_hw_wcn7850_rx_desc_get_dot11_hdr(struct hal_rx_desc *desc,
|
static void ath12k_hw_wcn7850_rx_desc_get_dot11_hdr(struct hal_rx_desc *desc,
|
||||||
@@ -1163,7 +1163,7 @@ const struct hal_ops hal_wcn7850_ops = {
|
|||||||
.rx_desc_get_msdu_end_offset = ath12k_hw_wcn7850_rx_desc_get_msdu_end_offset,
|
.rx_desc_get_msdu_end_offset = ath12k_hw_wcn7850_rx_desc_get_msdu_end_offset,
|
||||||
.rx_desc_mac_addr2_valid = ath12k_hw_wcn7850_rx_desc_mac_addr2_valid,
|
.rx_desc_mac_addr2_valid = ath12k_hw_wcn7850_rx_desc_mac_addr2_valid,
|
||||||
.rx_desc_mpdu_start_addr2 = ath12k_hw_wcn7850_rx_desc_mpdu_start_addr2,
|
.rx_desc_mpdu_start_addr2 = ath12k_hw_wcn7850_rx_desc_mpdu_start_addr2,
|
||||||
.rx_desc_is_mcbc = ath12k_hw_wcn7850_rx_desc_is_mcbc,
|
.rx_desc_is_da_mcbc = ath12k_hw_wcn7850_rx_desc_is_da_mcbc,
|
||||||
.rx_desc_get_dot11_hdr = ath12k_hw_wcn7850_rx_desc_get_dot11_hdr,
|
.rx_desc_get_dot11_hdr = ath12k_hw_wcn7850_rx_desc_get_dot11_hdr,
|
||||||
.rx_desc_get_crypto_header = ath12k_hw_wcn7850_rx_desc_get_crypto_hdr,
|
.rx_desc_get_crypto_header = ath12k_hw_wcn7850_rx_desc_get_crypto_hdr,
|
||||||
.rx_desc_get_mpdu_frame_ctl = ath12k_hw_wcn7850_rx_desc_get_mpdu_frame_ctl,
|
.rx_desc_get_mpdu_frame_ctl = ath12k_hw_wcn7850_rx_desc_get_mpdu_frame_ctl,
|
||||||
|
|||||||
@@ -1063,7 +1063,7 @@ struct hal_ops {
|
|||||||
u32 (*rx_desc_get_msdu_end_offset)(void);
|
u32 (*rx_desc_get_msdu_end_offset)(void);
|
||||||
bool (*rx_desc_mac_addr2_valid)(struct hal_rx_desc *desc);
|
bool (*rx_desc_mac_addr2_valid)(struct hal_rx_desc *desc);
|
||||||
u8* (*rx_desc_mpdu_start_addr2)(struct hal_rx_desc *desc);
|
u8* (*rx_desc_mpdu_start_addr2)(struct hal_rx_desc *desc);
|
||||||
bool (*rx_desc_is_mcbc)(struct hal_rx_desc *desc);
|
bool (*rx_desc_is_da_mcbc)(struct hal_rx_desc *desc);
|
||||||
void (*rx_desc_get_dot11_hdr)(struct hal_rx_desc *desc,
|
void (*rx_desc_get_dot11_hdr)(struct hal_rx_desc *desc,
|
||||||
struct ieee80211_hdr *hdr);
|
struct ieee80211_hdr *hdr);
|
||||||
u16 (*rx_desc_get_mpdu_frame_ctl)(struct hal_rx_desc *desc);
|
u16 (*rx_desc_get_mpdu_frame_ctl)(struct hal_rx_desc *desc);
|
||||||
|
|||||||
Reference in New Issue
Block a user