From: Linkai <k16622806...@126.com>

Signed-off-by: Linkai <k16622806...@126.com>
---
 ...exclusive-srng_write32-hif-api-for-srng-w.patch | 137 +++++++++++++++++++++
 1 file changed, 137 insertions(+)
 create mode 100644 
package/kernel/mac80211/patches/237-005-ath11k-Use-exclusive-srng_write32-hif-api-for-srng-w.patch

diff --git 
a/package/kernel/mac80211/patches/237-005-ath11k-Use-exclusive-srng_write32-hif-api-for-srng-w.patch
 
b/package/kernel/mac80211/patches/237-005-ath11k-Use-exclusive-srng_write32-hif-api-for-srng-w.patch
new file mode 100644
index 0000000..6764cf7
--- /dev/null
+++ 
b/package/kernel/mac80211/patches/237-005-ath11k-Use-exclusive-srng_write32-hif-api-for-srng-w.patch
@@ -0,0 +1,137 @@
+From 2b867c226aa6dae11cf320342b624caaef23b3f1 Mon Sep 17 00:00:00 2001
+From: P Praneesh <ppran...@codeaurora.org>
+Date: Mon, 14 Dec 2020 21:56:00 +0530
+Subject: [PATCH 5/6] ath11k: Use exclusive srng_write32 hif api for srng write
+ access
+
+Currently the pci_write32() performs multiple checks on the offset
+argument to identify if its a DP or CE mem offset, and selects
+a corresponding window start address to be added to the offset
+before performing the write operation.
+This could be costly for certain calls falling in the hotpath
+such as ath11k_hal_srng_access_end() which is used by the CE
+and DP code to update the srng head and tail pointer for src and
+dest rings correspondingly.
+
+Hence offload the window start determination during ring
+initialization itself and use the same offset which has window
+start address included for write operation.
+
+Added srng_write32 hif operation for this purpose.
+read32 is not used much in the datapath, hence using the
+existing hif call itself
+
+Signed-off-by: Sriram R <srirr...@codeaurora.org>
+Signed-off-by: P Praneesh <ppran...@codeaurora.org>
+---
+ drivers/net/wireless/ath/ath11k/ahb.c |  1 +
+ drivers/net/wireless/ath/ath11k/hal.c | 13 ++++++++-----
+ drivers/net/wireless/ath/ath11k/hif.h |  6 ++++++
+ drivers/net/wireless/ath/ath11k/pci.c |  7 +++++++
+ 4 files changed, 22 insertions(+), 5 deletions(-)
+
+--- a/drivers/net/wireless/ath/ath11k/ahb.c
++++ b/drivers/net/wireless/ath/ath11k/ahb.c
+@@ -745,6 +745,7 @@ static const struct ath11k_hif_ops ath11
+       .stop = ath11k_ahb_stop,
+       .read32 = ath11k_ahb_read32,
+       .write32 = ath11k_ahb_write32,
++      .srng_write32 = ath11k_ahb_write32,
+       .irq_enable = ath11k_ahb_ext_irq_enable,
+       .irq_disable = ath11k_ahb_ext_irq_disable,
+       .map_service_to_pipe = ath11k_ahb_map_service_to_pipe,
+--- a/drivers/net/wireless/ath/ath11k/hal.c
++++ b/drivers/net/wireless/ath/ath11k/hal.c
+@@ -837,13 +837,13 @@ void ath11k_hal_srng_access_end(struct a
+               if (srng->ring_dir == HAL_SRNG_DIR_SRC) {
+                       srng->u.src_ring.last_tp =
+                               *(volatile u32 *)srng->u.src_ring.tp_addr;
+-                      ath11k_hif_write32(ab,
++                      ath11k_hif_srng_write32(ab,
+                                          (unsigned 
long)srng->u.src_ring.hp_addr -
+                                          (unsigned long)mem,
+                                          srng->u.src_ring.hp);
+               } else {
+                       srng->u.dst_ring.last_hp = *srng->u.dst_ring.hp_addr;
+-                      ath11k_hif_write32(ab,
++                      ath11k_hif_srng_write32(ab,
+                                          (unsigned 
long)srng->u.dst_ring.tp_addr -
+                                          (unsigned long)mem,
+                                          srng->u.dst_ring.tp);
+@@ -957,6 +957,7 @@ int ath11k_hal_srng_setup(struct ath11k_
+       int i;
+       u32 reg_base;
+       unsigned long *mem;
++      u32 offset;
+ 
+       ring_id = ath11k_hal_srng_get_ring_id(ab, type, ring_num, mac_id);
+       if (ring_id < 0)
+@@ -1015,8 +1016,9 @@ int ath11k_hal_srng_setup(struct ath11k_
+                                                  lmac_idx);
+                       srng->flags |= HAL_SRNG_FLAGS_LMAC_RING;
+               } else {
++                      offset = ath11k_hif_get_window_offset(ab, reg_base);
+                       srng->u.src_ring.hp_addr =
+-                              (u32 *)((unsigned long)mem + reg_base);
++                              (u32 *)((unsigned long)mem + offset);
+               }
+       } else {
+               /* During initialization loop count in all the descriptors
+@@ -1040,9 +1042,10 @@ int ath11k_hal_srng_setup(struct ath11k_
+                                                  lmac_idx);
+                       srng->flags |= HAL_SRNG_FLAGS_LMAC_RING;
+               } else {
+-                      srng->u.dst_ring.tp_addr =
+-                              (u32 *)((unsigned long)mem + reg_base +
++                      offset = ath11k_hif_get_window_offset(ab, reg_base +
+                                       (HAL_REO1_RING_TP(ab) - 
HAL_REO1_RING_HP(ab)));
++                      srng->u.dst_ring.tp_addr =
++                              (u32 *)((unsigned long)mem + offset);
+               }
+       }
+ 
+--- a/drivers/net/wireless/ath/ath11k/hif.h
++++ b/drivers/net/wireless/ath/ath11k/hif.h
+@@ -11,6 +11,7 @@
+ struct ath11k_hif_ops {
+       u32 (*read32)(struct ath11k_base *sc, u32 address);
+       void (*write32)(struct ath11k_base *sc, u32 address, u32 data);
++      void (*srng_write32)(struct ath11k_base *sc, u32 address, u32 data);
+       void (*irq_enable)(struct ath11k_base *sc);
+       void (*irq_disable)(struct ath11k_base *sc);
+       int (*start)(struct ath11k_base *sc);
+@@ -72,6 +73,11 @@ static inline void ath11k_hif_write32(st
+       sc->hif.ops->write32(sc, address, data);
+ }
+ 
++static inline void ath11k_hif_srng_write32(struct ath11k_base *sc, u32 
address, u32 data)
++{
++      sc->hif.ops->srng_write32(sc, address, data);
++}
++
+ static inline int ath11k_hif_map_service_to_pipe(struct ath11k_base *sc, u16 
service_id,
+                                                u8 *ul_pipe, u8 *dl_pipe)
+ {
+--- a/drivers/net/wireless/ath/ath11k/pci.c
++++ b/drivers/net/wireless/ath/ath11k/pci.c
+@@ -140,6 +140,12 @@ void ath11k_pci_write32(struct ath11k_ba
+ }
+ EXPORT_SYMBOL(ath11k_pci_write32);
+ 
++/* To be used for ce/dp srng pointer write */
++void ath11k_pci_srng_write32(struct ath11k_base *ab, u32 offset, u32 value)
++{
++      iowrite32(value, ab->mem + offset);
++}
++
+ u32 ath11k_pci_read32(struct ath11k_base *ab, u32 offset)
+ {
+       struct ath11k_pci *ab_pci = NULL;
+@@ -1012,6 +1018,7 @@ static const struct ath11k_hif_ops ath11
+       .stop = ath11k_pci_stop,
+       .read32 = ath11k_pci_read32,
+       .write32 = ath11k_pci_write32,
++      .srng_write32 = ath11k_pci_srng_write32,
+       .power_down = ath11k_pci_power_down,
+       .power_up = ath11k_pci_power_up,
+       .irq_enable = ath11k_pci_ext_irq_enable,
-- 
2.7.4


_______________________________________________
openwrt-devel mailing list
openwrt-devel@lists.openwrt.org
https://lists.openwrt.org/mailman/listinfo/openwrt-devel

Reply via email to