2022-03-28 14:31:25

by Manikanta Pubbisetty

[permalink] [raw]
Subject: [PATCH v3] ath11k: Fix RX de-fragmentation issue on WCN6750

The offset of REO register where the RX fragment destination ring
is configured is different in WCN6750 as compared to WCN6855.
Due to this differnce in offsets, on WCN6750, fragment destination
ring will be configured incorrectly, leading to RX fragments not
getting delivered to the driver. Fix this by defining HW specific
offset for the REO MISC CTL register.

Tested-on: WCN6750 hw1.0 AHB WLAN.MSL.1.0.1-00573-QCAMSLSWPLZ-1
Tested-on: WCN6855 hw2.0 PCI WLAN.HSP.1.1-01720.1-QCAHSPSWPL_V1_V2_SILICONZ_LITE-1
Tested-on: QCN9074 hw1.0 PCI WLAN.HK.2.5.0.1-01100-QCAHKSWPL_SILICONZ-1
Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.4.0.1-00192-QCAHKSWPL_SILICONZ-1

Signed-off-by: Manikanta Pubbisetty <[email protected]>
---
Note:
* Dependent on Series "add support for WCN6750"
Link: https://patchwork.kernel.org/project/linux-wireless/cover/[email protected]/

V3:
- Rebased on ToT SHAID: 7316a74e54318d0cd648242b18ea83cdef6dda96

V2:
- Rebased on ToT

drivers/net/wireless/ath/ath11k/hal.h | 2 +-
drivers/net/wireless/ath/ath11k/hw.c | 10 ++++++++--
drivers/net/wireless/ath/ath11k/hw.h | 1 +
3 files changed, 10 insertions(+), 3 deletions(-)

diff --git a/drivers/net/wireless/ath/ath11k/hal.h b/drivers/net/wireless/ath/ath11k/hal.h
index 6fbda016cd63..347d45656536 100644
--- a/drivers/net/wireless/ath/ath11k/hal.h
+++ b/drivers/net/wireless/ath/ath11k/hal.h
@@ -121,7 +121,7 @@ struct ath11k_base;
#define HAL_REO1_DEST_RING_CTRL_IX_1 0x00000008
#define HAL_REO1_DEST_RING_CTRL_IX_2 0x0000000c
#define HAL_REO1_DEST_RING_CTRL_IX_3 0x00000010
-#define HAL_REO1_MISC_CTL 0x00000630
+#define HAL_REO1_MISC_CTL(ab) ab->hw_params.regs->hal_reo1_misc_ctl
#define HAL_REO1_RING_BASE_LSB(ab) ab->hw_params.regs->hal_reo1_ring_base_lsb
#define HAL_REO1_RING_BASE_MSB(ab) ab->hw_params.regs->hal_reo1_ring_base_msb
#define HAL_REO1_RING_ID(ab) ab->hw_params.regs->hal_reo1_ring_id
diff --git a/drivers/net/wireless/ath/ath11k/hw.c b/drivers/net/wireless/ath/ath11k/hw.c
index 3b9e45f9705c..87b0a9febcc1 100644
--- a/drivers/net/wireless/ath/ath11k/hw.c
+++ b/drivers/net/wireless/ath/ath11k/hw.c
@@ -771,10 +771,10 @@ static void ath11k_hw_wcn6855_reo_setup(struct ath11k_base *ab)
FIELD_PREP(HAL_REO1_GEN_ENABLE_AGING_FLUSH_ENABLE, 1);
ath11k_hif_write32(ab, reo_base + HAL_REO1_GEN_ENABLE, val);

- val = ath11k_hif_read32(ab, reo_base + HAL_REO1_MISC_CTL);
+ val = ath11k_hif_read32(ab, reo_base + HAL_REO1_MISC_CTL(ab));
val &= ~HAL_REO1_MISC_CTL_FRAGMENT_DST_RING;
val |= FIELD_PREP(HAL_REO1_MISC_CTL_FRAGMENT_DST_RING, HAL_SRNG_RING_ID_REO2SW1);
- ath11k_hif_write32(ab, reo_base + HAL_REO1_MISC_CTL, val);
+ ath11k_hif_write32(ab, reo_base + HAL_REO1_MISC_CTL(ab), val);

ath11k_hif_write32(ab, reo_base + HAL_REO1_AGING_THRESH_IX_0(ab),
HAL_DEFAULT_REO_TIMEOUT_USEC);
@@ -2229,6 +2229,9 @@ const struct ath11k_hw_regs wcn6855_regs = {

/* Shadow register area */
.hal_shadow_base_addr = 0x000008fc,
+
+ /* REO MISC CTRL */
+ .hal_reo1_misc_ctl = 0x00000630,
};

const struct ath11k_hw_regs wcn6750_regs = {
@@ -2311,6 +2314,9 @@ const struct ath11k_hw_regs wcn6750_regs = {

/* Shadow register area */
.hal_shadow_base_addr = 0x00000504,
+
+ /* REO MISC CTRL */
+ .hal_reo1_misc_ctl = 0x000005d8,
};

const struct ath11k_hw_hal_params ath11k_hw_hal_params_ipq8074 = {
diff --git a/drivers/net/wireless/ath/ath11k/hw.h b/drivers/net/wireless/ath/ath11k/hw.h
index f02120e76f99..72a04e8c6594 100644
--- a/drivers/net/wireless/ath/ath11k/hw.h
+++ b/drivers/net/wireless/ath/ath11k/hw.h
@@ -364,6 +364,7 @@ struct ath11k_hw_regs {
u32 pcie_pcs_osc_dtct_config_base;

u32 hal_shadow_base_addr;
+ u32 hal_reo1_misc_ctl;
};

extern const struct ath11k_hw_regs ipq8074_regs;
--
2.35.1


2022-05-02 20:23:06

by Kalle Valo

[permalink] [raw]
Subject: Re: [PATCH v3] ath11k: Fix RX de-fragmentation issue on WCN6750

Manikanta Pubbisetty <[email protected]> writes:

> The offset of REO register where the RX fragment destination ring
> is configured is different in WCN6750 as compared to WCN6855.
> Due to this differnce in offsets, on WCN6750, fragment destination
> ring will be configured incorrectly, leading to RX fragments not
> getting delivered to the driver. Fix this by defining HW specific
> offset for the REO MISC CTL register.
>
> Tested-on: WCN6750 hw1.0 AHB WLAN.MSL.1.0.1-00573-QCAMSLSWPLZ-1
> Tested-on: WCN6855 hw2.0 PCI WLAN.HSP.1.1-01720.1-QCAHSPSWPL_V1_V2_SILICONZ_LITE-1
> Tested-on: QCN9074 hw1.0 PCI WLAN.HK.2.5.0.1-01100-QCAHKSWPL_SILICONZ-1
> Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.4.0.1-00192-QCAHKSWPL_SILICONZ-1
>
> Signed-off-by: Manikanta Pubbisetty <[email protected]>

[...]

> @@ -2229,6 +2229,9 @@ const struct ath11k_hw_regs wcn6855_regs = {
>
> /* Shadow register area */
> .hal_shadow_base_addr = 0x000008fc,
> +
> + /* REO MISC CTRL */
> + .hal_reo1_misc_ctl = 0x00000630,
> };

I don't really see the benefit from the comment, it doesn't bring any
extra information.

> const struct ath11k_hw_regs wcn6750_regs = {
> @@ -2311,6 +2314,9 @@ const struct ath11k_hw_regs wcn6750_regs = {
>
> /* Shadow register area */
> .hal_shadow_base_addr = 0x00000504,
> +
> + /* REO MISC CTRL */
> + .hal_reo1_misc_ctl = 0x000005d8,

Ditto.

What about other ath11k_hw_regs tables:

<global>[1906] const struct ath11k_hw_regs ipq8074_regs = {
<global>[1988] const struct ath11k_hw_regs qca6390_regs = {
<global>[2070] const struct ath11k_hw_regs qcn9074_regs = {

You don't mention anything about those in the commit log. If they don't
use this register (didn't check) we should at least initialise the
fields to zero, deadbeef or something to make it clear they are unused.

--
https://patchwork.kernel.org/project/linux-wireless/list/

https://wireless.wiki.kernel.org/en/developers/documentation/submittingpatches

2022-05-04 13:24:24

by Manikanta Pubbisetty

[permalink] [raw]
Subject: Re: [PATCH v3] ath11k: Fix RX de-fragmentation issue on WCN6750

On 5/2/2022 7:55 PM, Kalle Valo wrote:
> Manikanta Pubbisetty <[email protected]> writes:
>
>> The offset of REO register where the RX fragment destination ring
>> is configured is different in WCN6750 as compared to WCN6855.
>> Due to this differnce in offsets, on WCN6750, fragment destination
>> ring will be configured incorrectly, leading to RX fragments not
>> getting delivered to the driver. Fix this by defining HW specific
>> offset for the REO MISC CTL register.
>>
>> Tested-on: WCN6750 hw1.0 AHB WLAN.MSL.1.0.1-00573-QCAMSLSWPLZ-1
>> Tested-on: WCN6855 hw2.0 PCI WLAN.HSP.1.1-01720.1-QCAHSPSWPL_V1_V2_SILICONZ_LITE-1
>> Tested-on: QCN9074 hw1.0 PCI WLAN.HK.2.5.0.1-01100-QCAHKSWPL_SILICONZ-1
>> Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.4.0.1-00192-QCAHKSWPL_SILICONZ-1
>>
>> Signed-off-by: Manikanta Pubbisetty <[email protected]>
>
> [...]
>
>> @@ -2229,6 +2229,9 @@ const struct ath11k_hw_regs wcn6855_regs = {
>>
>> /* Shadow register area */
>> .hal_shadow_base_addr = 0x000008fc,
>> +
>> + /* REO MISC CTRL */
>> + .hal_reo1_misc_ctl = 0x00000630,
>> };
>
> I don't really see the benefit from the comment, it doesn't bring any
> extra information.
>

You are right, let me check if I can add any info or I'll remove the
comment.

>> const struct ath11k_hw_regs wcn6750_regs = {
>> @@ -2311,6 +2314,9 @@ const struct ath11k_hw_regs wcn6750_regs = {
>>
>> /* Shadow register area */
>> .hal_shadow_base_addr = 0x00000504,
>> +
>> + /* REO MISC CTRL */
>> + .hal_reo1_misc_ctl = 0x000005d8,
>
> Ditto.
>
> What about other ath11k_hw_regs tables:
>
> <global>[1906] const struct ath11k_hw_regs ipq8074_regs = {
> <global>[1988] const struct ath11k_hw_regs qca6390_regs = {
> <global>[2070] const struct ath11k_hw_regs qcn9074_regs = {
>
> You don't mention anything about those in the commit log. If they don't
> use this register (didn't check) we should at least initialise the
> fields to zero, deadbeef or something to make it clear they are unused.
>

Let me make the changes to initialize the register to 0(zero) for other
unsupported hardware.

Thanks,
Manikanta