Some fields of hal_reo_update_rx_queue are wrongly
defined, fix it in the first patch.
Currently the maximum block ACK window size is 256,
with the second patch, it is extended to BA1024.
The small MAC buffer ring becomes the bottle neck
in RX throughput test, so enlarge its size to get
a better peak result. This is done is the third patch.
With above three changes, more than 6% increase is
seen in RX throughput test.
v2:
1. wifi: ath12k: fix wrong definitions of hal_reo_update_rx_queue
no change.
2. wifi: ath12k: add support for BA1024
a) s/doen/done
b) update struct hal_rx_reo_queue_1k
3. wifi: ath12k: change MAC buffer ring size to 2048
no change.
Baochen Qiang (3):
wifi: ath12k: fix wrong definitions of hal_reo_update_rx_queue
wifi: ath12k: add support for BA1024
wifi: ath12k: change MAC buffer ring size to 2048
drivers/net/wireless/ath/ath12k/dp.h | 3 ++-
drivers/net/wireless/ath/ath12k/dp_rx.c | 2 +-
drivers/net/wireless/ath/ath12k/hal_desc.h | 20 +++++++++++++-------
drivers/net/wireless/ath/ath12k/hal_rx.c | 11 ++++++++---
drivers/net/wireless/ath/ath12k/mac.c | 2 +-
5 files changed, 25 insertions(+), 13 deletions(-)
base-commit: 16a212b4f33c4edd9ce9a9e0953b5389216e8ed9
--
2.25.1
For WCN7850, there is a SRNG named MAC buffer ring, i.e.,
dp->rx_mac_buf_ring. During initialization, it is setup
by host and then under control of firmware. During RX
process, firmware fetches buffers from
dp->rx_refill_buf_ring to fill that MAC buffer ring,
and those buffers are taken by RXDMA to carry real WLAN
frames received from air.
Currently a low RX throughput is observed. Checking
firmware log, lots of errors are reported by MAC buffer
ring, complaining that it is running out of buffers,
which further indicates that RXDMA is suffering from
starvation. Currently the size of dp->rx_mac_buf_ring
is configured as 1024. After changing it to 2048, those
error messages are reduced, and a 6.4% increase is seen
in peak throughput. Note that 2048 is an empirical
value. It is chosen here because the RX throughput
meets our expectation after the change.
This change only applies to WCN7850 since other
chips don't have a MAC buffer ring.
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 <[email protected]>
---
v2:
no change.
drivers/net/wireless/ath/ath12k/dp.h | 1 +
drivers/net/wireless/ath/ath12k/dp_rx.c | 2 +-
2 files changed, 2 insertions(+), 1 deletion(-)
diff --git a/drivers/net/wireless/ath/ath12k/dp.h b/drivers/net/wireless/ath/ath12k/dp.h
index 50db1403ebce..ce55cb550379 100644
--- a/drivers/net/wireless/ath/ath12k/dp.h
+++ b/drivers/net/wireless/ath/ath12k/dp.h
@@ -165,6 +165,7 @@ struct ath12k_pdev_dp {
#define DP_REO_CMD_RING_SIZE 128
#define DP_REO_STATUS_RING_SIZE 2048
#define DP_RXDMA_BUF_RING_SIZE 4096
+#define DP_RX_MAC_BUF_RING_SIZE 2048
#define DP_RXDMA_REFILL_RING_SIZE 2048
#define DP_RXDMA_ERR_DST_RING_SIZE 1024
#define DP_RXDMA_MON_STATUS_RING_SIZE 1024
diff --git a/drivers/net/wireless/ath/ath12k/dp_rx.c b/drivers/net/wireless/ath/ath12k/dp_rx.c
index 9f831e3971f9..f6fbe867bbd4 100644
--- a/drivers/net/wireless/ath/ath12k/dp_rx.c
+++ b/drivers/net/wireless/ath/ath12k/dp_rx.c
@@ -4110,7 +4110,7 @@ int ath12k_dp_rx_alloc(struct ath12k_base *ab)
ret = ath12k_dp_srng_setup(ab,
&dp->rx_mac_buf_ring[i],
HAL_RXDMA_BUF, 1,
- i, 1024);
+ i, DP_RX_MAC_BUF_RING_SIZE);
if (ret) {
ath12k_warn(ab, "failed to setup rx_mac_buf_ring %d\n",
i);
--
2.25.1
Some fields of hal_reo_update_rx_queue structure are wrongly
defined, so fix it.
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 <[email protected]>
---
v2:
no change.
drivers/net/wireless/ath/ath12k/hal_desc.h | 14 +++++++-------
1 file changed, 7 insertions(+), 7 deletions(-)
diff --git a/drivers/net/wireless/ath/ath12k/hal_desc.h b/drivers/net/wireless/ath/ath12k/hal_desc.h
index 6c17adc6d60b..ec204939e50c 100644
--- a/drivers/net/wireless/ath/ath12k/hal_desc.h
+++ b/drivers/net/wireless/ath/ath12k/hal_desc.h
@@ -2500,13 +2500,13 @@ struct hal_rx_reo_queue {
#define HAL_REO_UPD_RX_QUEUE_INFO1_PN_HANDLE_ENABLE BIT(30)
#define HAL_REO_UPD_RX_QUEUE_INFO1_IGNORE_AMPDU_FLG BIT(31)
-#define HAL_REO_UPD_RX_QUEUE_INFO2_BA_WINDOW_SIZE GENMASK(7, 0)
-#define HAL_REO_UPD_RX_QUEUE_INFO2_PN_SIZE GENMASK(9, 8)
-#define HAL_REO_UPD_RX_QUEUE_INFO2_SVLD BIT(10)
-#define HAL_REO_UPD_RX_QUEUE_INFO2_SSN GENMASK(22, 11)
-#define HAL_REO_UPD_RX_QUEUE_INFO2_SEQ_2K_ERR BIT(23)
-#define HAL_REO_UPD_RX_QUEUE_INFO2_PN_ERR BIT(24)
-#define HAL_REO_UPD_RX_QUEUE_INFO2_PN_VALID BIT(25)
+#define HAL_REO_UPD_RX_QUEUE_INFO2_BA_WINDOW_SIZE GENMASK(9, 0)
+#define HAL_REO_UPD_RX_QUEUE_INFO2_PN_SIZE GENMASK(11, 10)
+#define HAL_REO_UPD_RX_QUEUE_INFO2_SVLD BIT(12)
+#define HAL_REO_UPD_RX_QUEUE_INFO2_SSN GENMASK(24, 13)
+#define HAL_REO_UPD_RX_QUEUE_INFO2_SEQ_2K_ERR BIT(25)
+#define HAL_REO_UPD_RX_QUEUE_INFO2_PN_ERR BIT(26)
+#define HAL_REO_UPD_RX_QUEUE_INFO2_PN_VALID BIT(27)
struct hal_reo_update_rx_queue {
struct hal_reo_cmd_hdr cmd;
--
2.25.1
Currently the maximum block ACK window size supported is 256.
This results in that, when connected to an AP which supports
larger BA sizes like BA512 or BA1024, only BA256 is
established, leading to a lower peak throughput.
So add support for BA1024, this is done by allocating a larger
REO queue and advertising IEEE80211_MAX_AMPDU_BUF_EHT support
to MAC80211.
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 <[email protected]>
---
v2:
1. s/doen/done/
2. update struct hal_rx_reo_queue_1k.
drivers/net/wireless/ath/ath12k/dp.h | 2 +-
drivers/net/wireless/ath/ath12k/hal_desc.h | 6 ++++++
drivers/net/wireless/ath/ath12k/hal_rx.c | 11 ++++++++---
drivers/net/wireless/ath/ath12k/mac.c | 2 +-
4 files changed, 16 insertions(+), 5 deletions(-)
diff --git a/drivers/net/wireless/ath/ath12k/dp.h b/drivers/net/wireless/ath/ath12k/dp.h
index 61f765432516..50db1403ebce 100644
--- a/drivers/net/wireless/ath/ath12k/dp.h
+++ b/drivers/net/wireless/ath/ath12k/dp.h
@@ -145,7 +145,7 @@ struct ath12k_pdev_dp {
#define DP_RX_HASH_ENABLE 1 /* Enable hash based Rx steering */
-#define DP_BA_WIN_SZ_MAX 256
+#define DP_BA_WIN_SZ_MAX 1024
#define DP_TCL_NUM_RING_MAX 4
diff --git a/drivers/net/wireless/ath/ath12k/hal_desc.h b/drivers/net/wireless/ath/ath12k/hal_desc.h
index ec204939e50c..63340256d3f6 100644
--- a/drivers/net/wireless/ath/ath12k/hal_desc.h
+++ b/drivers/net/wireless/ath/ath12k/hal_desc.h
@@ -2517,6 +2517,12 @@ struct hal_reo_update_rx_queue {
__le32 pn[4];
} __packed;
+struct hal_rx_reo_queue_1k {
+ struct hal_desc_header desc_hdr;
+ __le32 rx_bitmap_1023_288[23];
+ __le32 reserved[8];
+} __packed;
+
#define HAL_REO_UNBLOCK_CACHE_INFO0_UNBLK_CACHE BIT(0)
#define HAL_REO_UNBLOCK_CACHE_INFO0_RESOURCE_IDX GENMASK(2, 1)
diff --git a/drivers/net/wireless/ath/ath12k/hal_rx.c b/drivers/net/wireless/ath/ath12k/hal_rx.c
index f6afbd8196bf..6fa874a93d3a 100644
--- a/drivers/net/wireless/ath/ath12k/hal_rx.c
+++ b/drivers/net/wireless/ath/ath12k/hal_rx.c
@@ -688,23 +688,28 @@ void ath12k_hal_reo_update_rx_reo_queue_status(struct ath12k_base *ab,
u32 ath12k_hal_reo_qdesc_size(u32 ba_window_size, u8 tid)
{
- u32 num_ext_desc;
+ u32 num_ext_desc, num_1k_desc = 0;
if (ba_window_size <= 1) {
if (tid != HAL_DESC_REO_NON_QOS_TID)
num_ext_desc = 1;
else
num_ext_desc = 0;
+
} else if (ba_window_size <= 105) {
num_ext_desc = 1;
} else if (ba_window_size <= 210) {
num_ext_desc = 2;
- } else {
+ } else if (ba_window_size <= 256) {
num_ext_desc = 3;
+ } else {
+ num_ext_desc = 10;
+ num_1k_desc = 1;
}
return sizeof(struct hal_rx_reo_queue) +
- (num_ext_desc * sizeof(struct hal_rx_reo_queue_ext));
+ (num_ext_desc * sizeof(struct hal_rx_reo_queue_ext)) +
+ (num_1k_desc * sizeof(struct hal_rx_reo_queue_1k));
}
void ath12k_hal_reo_qdesc_setup(struct hal_rx_reo_queue *qdesc,
diff --git a/drivers/net/wireless/ath/ath12k/mac.c b/drivers/net/wireless/ath/ath12k/mac.c
index fc0d14ea328e..3cfb17f71aa6 100644
--- a/drivers/net/wireless/ath/ath12k/mac.c
+++ b/drivers/net/wireless/ath/ath12k/mac.c
@@ -7474,7 +7474,7 @@ static int __ath12k_mac_register(struct ath12k *ar)
ar->hw->queues = ATH12K_HW_MAX_QUEUES;
ar->hw->wiphy->tx_queue_len = ATH12K_QUEUE_LEN;
ar->hw->offchannel_tx_hw_queue = ATH12K_HW_MAX_QUEUES - 1;
- ar->hw->max_rx_aggregation_subframes = IEEE80211_MAX_AMPDU_BUF_HE;
+ ar->hw->max_rx_aggregation_subframes = IEEE80211_MAX_AMPDU_BUF_EHT;
ar->hw->vif_data_size = sizeof(struct ath12k_vif);
ar->hw->sta_data_size = sizeof(struct ath12k_sta);
--
2.25.1
On 11/28/2023 6:04 PM, Baochen Qiang wrote:
> Some fields of hal_reo_update_rx_queue structure are wrongly
> defined, so fix it.
>
> 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 <[email protected]>
Acked-by: Jeff Johnson <[email protected]>
On 11/28/2023 6:04 PM, Baochen Qiang wrote:
> Currently the maximum block ACK window size supported is 256.
> This results in that, when connected to an AP which supports
> larger BA sizes like BA512 or BA1024, only BA256 is
> established, leading to a lower peak throughput.
>
> So add support for BA1024, this is done by allocating a larger
> REO queue and advertising IEEE80211_MAX_AMPDU_BUF_EHT support
> to MAC80211.
>
> 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 <[email protected]>
Acked-by: Jeff Johnson <[email protected]>
On 11/28/2023 6:04 PM, Baochen Qiang wrote:
> For WCN7850, there is a SRNG named MAC buffer ring, i.e.,
> dp->rx_mac_buf_ring. During initialization, it is setup
> by host and then under control of firmware. During RX
> process, firmware fetches buffers from
> dp->rx_refill_buf_ring to fill that MAC buffer ring,
> and those buffers are taken by RXDMA to carry real WLAN
> frames received from air.
>
> Currently a low RX throughput is observed. Checking
> firmware log, lots of errors are reported by MAC buffer
> ring, complaining that it is running out of buffers,
> which further indicates that RXDMA is suffering from
> starvation. Currently the size of dp->rx_mac_buf_ring
> is configured as 1024. After changing it to 2048, those
> error messages are reduced, and a 6.4% increase is seen
> in peak throughput. Note that 2048 is an empirical
> value. It is chosen here because the RX throughput
> meets our expectation after the change.
>
> This change only applies to WCN7850 since other
> chips don't have a MAC buffer ring.
>
> 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 <[email protected]>
Acked-by: Jeff Johnson <[email protected]>
Baochen Qiang <[email protected]> writes:
> Some fields of hal_reo_update_rx_queue are wrongly
> defined, fix it in the first patch.
>
> Currently the maximum block ACK window size is 256,
> with the second patch, it is extended to BA1024.
>
> The small MAC buffer ring becomes the bottle neck
> in RX throughput test, so enlarge its size to get
> a better peak result. This is done is the third patch.
>
> With above three changes, more than 6% increase is
> seen in RX throughput test.
>
> v2:
> 1. wifi: ath12k: fix wrong definitions of hal_reo_update_rx_queue
> no change.
> 2. wifi: ath12k: add support for BA1024
> a) s/doen/done
> b) update struct hal_rx_reo_queue_1k
> 3. wifi: ath12k: change MAC buffer ring size to 2048
> no change.
>
> Baochen Qiang (3):
> wifi: ath12k: fix wrong definitions of hal_reo_update_rx_queue
> wifi: ath12k: add support for BA1024
> wifi: ath12k: change MAC buffer ring size to 2048
I had conflicts, please double check:
https://git.kernel.org/pub/scm/linux/kernel/git/kvalo/ath.git/commit/?h=pending&id=1ee7c1872873d82a71e05a4e17cbf9a569bc8ec9
https://git.kernel.org/pub/scm/linux/kernel/git/kvalo/ath.git/commit/?h=pending&id=4d75db679457b5b7e04271f5174d9128d7d73ecf
https://git.kernel.org/pub/scm/linux/kernel/git/kvalo/ath.git/commit/?h=pending&id=db549be42740d286ee6ec8b2860b4e4789be2167
--
https://patchwork.kernel.org/project/linux-wireless/list/
https://wireless.wiki.kernel.org/en/developers/documentation/submittingpatches
On 1/17/2024 5:46 AM, Kalle Valo wrote:
> Baochen Qiang <[email protected]> writes:
>
>> Some fields of hal_reo_update_rx_queue are wrongly
>> defined, fix it in the first patch.
>>
>> Currently the maximum block ACK window size is 256,
>> with the second patch, it is extended to BA1024.
>>
>> The small MAC buffer ring becomes the bottle neck
>> in RX throughput test, so enlarge its size to get
>> a better peak result. This is done is the third patch.
>>
>> With above three changes, more than 6% increase is
>> seen in RX throughput test.
>>
>> v2:
>> 1. wifi: ath12k: fix wrong definitions of hal_reo_update_rx_queue
>> no change.
>> 2. wifi: ath12k: add support for BA1024
>> a) s/doen/done
>> b) update struct hal_rx_reo_queue_1k
>> 3. wifi: ath12k: change MAC buffer ring size to 2048
>> no change.
>>
>> Baochen Qiang (3):
>> wifi: ath12k: fix wrong definitions of hal_reo_update_rx_queue
>> wifi: ath12k: add support for BA1024
>> wifi: ath12k: change MAC buffer ring size to 2048
>
> I had conflicts, please double check:
>
> https://git.kernel.org/pub/scm/linux/kernel/git/kvalo/ath.git/commit/?h=pending&id=1ee7c1872873d82a71e05a4e17cbf9a569bc8ec9
> https://git.kernel.org/pub/scm/linux/kernel/git/kvalo/ath.git/commit/?h=pending&id=4d75db679457b5b7e04271f5174d9128d7d73ecf
> https://git.kernel.org/pub/scm/linux/kernel/git/kvalo/ath.git/commit/?h=pending&id=db549be42740d286ee6ec8b2860b4e4789be2167
These look good to me, but Baochen should also confirm
On 1/17/2024 11:32 PM, Jeff Johnson wrote:
> On 1/17/2024 5:46 AM, Kalle Valo wrote:
>> Baochen Qiang <[email protected]> writes:
>>
>>> Some fields of hal_reo_update_rx_queue are wrongly
>>> defined, fix it in the first patch.
>>>
>>> Currently the maximum block ACK window size is 256,
>>> with the second patch, it is extended to BA1024.
>>>
>>> The small MAC buffer ring becomes the bottle neck
>>> in RX throughput test, so enlarge its size to get
>>> a better peak result. This is done is the third patch.
>>>
>>> With above three changes, more than 6% increase is
>>> seen in RX throughput test.
>>>
>>> v2:
>>> 1. wifi: ath12k: fix wrong definitions of hal_reo_update_rx_queue
>>> no change.
>>> 2. wifi: ath12k: add support for BA1024
>>> a) s/doen/done
>>> b) update struct hal_rx_reo_queue_1k
>>> 3. wifi: ath12k: change MAC buffer ring size to 2048
>>> no change.
>>>
>>> Baochen Qiang (3):
>>> wifi: ath12k: fix wrong definitions of hal_reo_update_rx_queue
>>> wifi: ath12k: add support for BA1024
>>> wifi: ath12k: change MAC buffer ring size to 2048
>>
>> I had conflicts, please double check:
>>
>> https://git.kernel.org/pub/scm/linux/kernel/git/kvalo/ath.git/commit/?h=pending&id=1ee7c1872873d82a71e05a4e17cbf9a569bc8ec9
>> https://git.kernel.org/pub/scm/linux/kernel/git/kvalo/ath.git/commit/?h=pending&id=4d75db679457b5b7e04271f5174d9128d7d73ecf
>> https://git.kernel.org/pub/scm/linux/kernel/git/kvalo/ath.git/commit/?h=pending&id=db549be42740d286ee6ec8b2860b4e4789be2167
>
> These look good to me, but Baochen should also confirm
>
Also looks good to me.
Baochen Qiang <[email protected]> wrote:
> Some fields of hal_reo_update_rx_queue structure are wrongly
> defined, so fix it.
>
> 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 <[email protected]>
> Acked-by: Jeff Johnson <[email protected]>
> Signed-off-by: Kalle Valo <[email protected]>
3 patches applied to ath-next branch of ath.git, thanks.
60b937658321 wifi: ath12k: fix wrong definitions of hal_reo_update_rx_queue
b0970f50839e wifi: ath12k: add support for BA1024
955df16f2a4c wifi: ath12k: change MAC buffer ring size to 2048
--
https://patchwork.kernel.org/project/linux-wireless/patch/[email protected]/
https://wireless.wiki.kernel.org/en/developers/documentation/submittingpatches