ce09894398
Signed-off-by: Felix Fietkau <nbd@openwrt.org> SVN-Revision: 47287
60 lines
2.1 KiB
Diff
60 lines
2.1 KiB
Diff
From: Rajkumar Manoharan <rmanohar@qti.qualcomm.com>
|
|
Date: Fri, 23 Oct 2015 18:01:03 +0530
|
|
Subject: [PATCH] ath10k: use local memory instead of shadow descriptor
|
|
in ce_send
|
|
|
|
Currently to avoid uncached memory access while filling up copy engine
|
|
descriptors, shadow descriptors are used. This can be optimized further
|
|
by removing shadow descriptors. To achieve that first shadow ring
|
|
dependency in ce_send is removed by creating local copy of the
|
|
descriptor on stack and make a one-shot copy into the "uncached"
|
|
descriptor.
|
|
|
|
Signed-off-by: Rajkumar Manoharan <rmanohar@qti.qualcomm.com>
|
|
Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
|
|
---
|
|
|
|
--- a/drivers/net/wireless/ath/ath10k/ce.c
|
|
+++ b/drivers/net/wireless/ath/ath10k/ce.c
|
|
@@ -274,7 +274,7 @@ int ath10k_ce_send_nolock(struct ath10k_
|
|
{
|
|
struct ath10k *ar = ce_state->ar;
|
|
struct ath10k_ce_ring *src_ring = ce_state->src_ring;
|
|
- struct ce_desc *desc, *sdesc;
|
|
+ struct ce_desc *desc, sdesc;
|
|
unsigned int nentries_mask = src_ring->nentries_mask;
|
|
unsigned int sw_index = src_ring->sw_index;
|
|
unsigned int write_index = src_ring->write_index;
|
|
@@ -294,7 +294,6 @@ int ath10k_ce_send_nolock(struct ath10k_
|
|
|
|
desc = CE_SRC_RING_TO_DESC(src_ring->base_addr_owner_space,
|
|
write_index);
|
|
- sdesc = CE_SRC_RING_TO_DESC(src_ring->shadow_base, write_index);
|
|
|
|
desc_flags |= SM(transfer_id, CE_DESC_FLAGS_META_DATA);
|
|
|
|
@@ -303,11 +302,11 @@ int ath10k_ce_send_nolock(struct ath10k_
|
|
if (flags & CE_SEND_FLAG_BYTE_SWAP)
|
|
desc_flags |= CE_DESC_FLAGS_BYTE_SWAP;
|
|
|
|
- sdesc->addr = __cpu_to_le32(buffer);
|
|
- sdesc->nbytes = __cpu_to_le16(nbytes);
|
|
- sdesc->flags = __cpu_to_le16(desc_flags);
|
|
+ sdesc.addr = __cpu_to_le32(buffer);
|
|
+ sdesc.nbytes = __cpu_to_le16(nbytes);
|
|
+ sdesc.flags = __cpu_to_le16(desc_flags);
|
|
|
|
- *desc = *sdesc;
|
|
+ *desc = sdesc;
|
|
|
|
src_ring->per_transfer_context[write_index] = per_transfer_context;
|
|
|
|
@@ -614,7 +613,7 @@ int ath10k_ce_completed_send_next_nolock
|
|
if (read_index == sw_index)
|
|
return -EIO;
|
|
|
|
- sbase = src_ring->shadow_base;
|
|
+ sbase = src_ring->base_addr_owner_space;
|
|
sdesc = CE_SRC_RING_TO_DESC(sbase, sw_index);
|
|
|
|
/* Return data from completed source descriptor */
|