306-ath10k-use-local-memory-instead-of-shadow-descriptor.patch 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. From: Rajkumar Manoharan <[email protected]>
  2. Date: Fri, 23 Oct 2015 18:01:03 +0530
  3. Subject: [PATCH] ath10k: use local memory instead of shadow descriptor
  4. in ce_send
  5. Currently to avoid uncached memory access while filling up copy engine
  6. descriptors, shadow descriptors are used. This can be optimized further
  7. by removing shadow descriptors. To achieve that first shadow ring
  8. dependency in ce_send is removed by creating local copy of the
  9. descriptor on stack and make a one-shot copy into the "uncached"
  10. descriptor.
  11. Signed-off-by: Rajkumar Manoharan <[email protected]>
  12. Signed-off-by: Kalle Valo <[email protected]>
  13. ---
  14. --- a/drivers/net/wireless/ath/ath10k/ce.c
  15. +++ b/drivers/net/wireless/ath/ath10k/ce.c
  16. @@ -274,7 +274,7 @@ int ath10k_ce_send_nolock(struct ath10k_
  17. {
  18. struct ath10k *ar = ce_state->ar;
  19. struct ath10k_ce_ring *src_ring = ce_state->src_ring;
  20. - struct ce_desc *desc, *sdesc;
  21. + struct ce_desc *desc, sdesc;
  22. unsigned int nentries_mask = src_ring->nentries_mask;
  23. unsigned int sw_index = src_ring->sw_index;
  24. unsigned int write_index = src_ring->write_index;
  25. @@ -294,7 +294,6 @@ int ath10k_ce_send_nolock(struct ath10k_
  26. desc = CE_SRC_RING_TO_DESC(src_ring->base_addr_owner_space,
  27. write_index);
  28. - sdesc = CE_SRC_RING_TO_DESC(src_ring->shadow_base, write_index);
  29. desc_flags |= SM(transfer_id, CE_DESC_FLAGS_META_DATA);
  30. @@ -303,11 +302,11 @@ int ath10k_ce_send_nolock(struct ath10k_
  31. if (flags & CE_SEND_FLAG_BYTE_SWAP)
  32. desc_flags |= CE_DESC_FLAGS_BYTE_SWAP;
  33. - sdesc->addr = __cpu_to_le32(buffer);
  34. - sdesc->nbytes = __cpu_to_le16(nbytes);
  35. - sdesc->flags = __cpu_to_le16(desc_flags);
  36. + sdesc.addr = __cpu_to_le32(buffer);
  37. + sdesc.nbytes = __cpu_to_le16(nbytes);
  38. + sdesc.flags = __cpu_to_le16(desc_flags);
  39. - *desc = *sdesc;
  40. + *desc = sdesc;
  41. src_ring->per_transfer_context[write_index] = per_transfer_context;
  42. @@ -614,7 +613,7 @@ int ath10k_ce_completed_send_next_nolock
  43. if (read_index == sw_index)
  44. return -EIO;
  45. - sbase = src_ring->shadow_base;
  46. + sbase = src_ring->base_addr_owner_space;
  47. sdesc = CE_SRC_RING_TO_DESC(sbase, sw_index);
  48. /* Return data from completed source descriptor */