]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - drivers/net/wireless/ath/ath10k/ce.c
Merge remote-tracking branch 'sound-current/for-linus'
[karo-tx-linux.git] / drivers / net / wireless / ath / ath10k / ce.c
index cf28fbebaedcfc9b372d509c6a88fcbc2d808773..edf3629288bc49cb1832b41028efdd79b8b32546 100644 (file)
@@ -274,7 +274,7 @@ int ath10k_ce_send_nolock(struct ath10k_ce_pipe *ce_state,
 {
        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_ce_pipe *ce_state,
 
        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_ce_pipe *ce_state,
        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;
 
@@ -413,7 +412,7 @@ int __ath10k_ce_rx_post_buf(struct ath10k_ce_pipe *pipe, void *ctx, u32 paddr)
        lockdep_assert_held(&ar_pci->ce_lock);
 
        if (CE_RING_DELTA(nentries_mask, write_index, sw_index - 1) == 0)
-               return -EIO;
+               return -ENOSPC;
 
        desc->addr = __cpu_to_le32(paddr);
        desc->nbytes = 0;
@@ -579,17 +578,13 @@ int ath10k_ce_revoke_recv_next(struct ath10k_ce_pipe *ce_state,
  * The caller takes responsibility for any necessary locking.
  */
 int ath10k_ce_completed_send_next_nolock(struct ath10k_ce_pipe *ce_state,
-                                        void **per_transfer_contextp,
-                                        u32 *bufferp,
-                                        unsigned int *nbytesp,
-                                        unsigned int *transfer_idp)
+                                        void **per_transfer_contextp)
 {
        struct ath10k_ce_ring *src_ring = ce_state->src_ring;
        u32 ctrl_addr = ce_state->ctrl_addr;
        struct ath10k *ar = ce_state->ar;
        unsigned int nentries_mask = src_ring->nentries_mask;
        unsigned int sw_index = src_ring->sw_index;
-       struct ce_desc *sdesc, *sbase;
        unsigned int read_index;
 
        if (src_ring->hw_index == sw_index) {
@@ -614,15 +609,6 @@ int ath10k_ce_completed_send_next_nolock(struct ath10k_ce_pipe *ce_state,
        if (read_index == sw_index)
                return -EIO;
 
-       sbase = src_ring->shadow_base;
-       sdesc = CE_SRC_RING_TO_DESC(sbase, sw_index);
-
-       /* Return data from completed source descriptor */
-       *bufferp = __le32_to_cpu(sdesc->addr);
-       *nbytesp = __le16_to_cpu(sdesc->nbytes);
-       *transfer_idp = MS(__le16_to_cpu(sdesc->flags),
-                          CE_DESC_FLAGS_META_DATA);
-
        if (per_transfer_contextp)
                *per_transfer_contextp =
                        src_ring->per_transfer_context[sw_index];
@@ -697,10 +683,7 @@ int ath10k_ce_cancel_send_next(struct ath10k_ce_pipe *ce_state,
 }
 
 int ath10k_ce_completed_send_next(struct ath10k_ce_pipe *ce_state,
-                                 void **per_transfer_contextp,
-                                 u32 *bufferp,
-                                 unsigned int *nbytesp,
-                                 unsigned int *transfer_idp)
+                                 void **per_transfer_contextp)
 {
        struct ath10k *ar = ce_state->ar;
        struct ath10k_pci *ar_pci = ath10k_pci_priv(ar);
@@ -708,9 +691,7 @@ int ath10k_ce_completed_send_next(struct ath10k_ce_pipe *ce_state,
 
        spin_lock_bh(&ar_pci->ce_lock);
        ret = ath10k_ce_completed_send_next_nolock(ce_state,
-                                                  per_transfer_contextp,
-                                                  bufferp, nbytesp,
-                                                  transfer_idp);
+                                                  per_transfer_contextp);
        spin_unlock_bh(&ar_pci->ce_lock);
 
        return ret;
@@ -940,27 +921,6 @@ ath10k_ce_alloc_src_ring(struct ath10k *ar, unsigned int ce_id,
                        src_ring->base_addr_ce_space_unaligned,
                        CE_DESC_RING_ALIGN);
 
-       /*
-        * Also allocate a shadow src ring in regular
-        * mem to use for faster access.
-        */
-       src_ring->shadow_base_unaligned =
-               kmalloc((nentries * sizeof(struct ce_desc) +
-                        CE_DESC_RING_ALIGN), GFP_KERNEL);
-       if (!src_ring->shadow_base_unaligned) {
-               dma_free_coherent(ar->dev,
-                                 (nentries * sizeof(struct ce_desc) +
-                                  CE_DESC_RING_ALIGN),
-                                 src_ring->base_addr_owner_space,
-                                 src_ring->base_addr_ce_space);
-               kfree(src_ring);
-               return ERR_PTR(-ENOMEM);
-       }
-
-       src_ring->shadow_base = PTR_ALIGN(
-                       src_ring->shadow_base_unaligned,
-                       CE_DESC_RING_ALIGN);
-
        return src_ring;
 }
 
@@ -1076,9 +1036,7 @@ void ath10k_ce_deinit_pipe(struct ath10k *ar, unsigned int ce_id)
 }
 
 int ath10k_ce_alloc_pipe(struct ath10k *ar, int ce_id,
-                        const struct ce_attr *attr,
-                        void (*send_cb)(struct ath10k_ce_pipe *),
-                        void (*recv_cb)(struct ath10k_ce_pipe *))
+                        const struct ce_attr *attr)
 {
        struct ath10k_pci *ar_pci = ath10k_pci_priv(ar);
        struct ath10k_ce_pipe *ce_state = &ar_pci->ce_states[ce_id];
@@ -1104,10 +1062,10 @@ int ath10k_ce_alloc_pipe(struct ath10k *ar, int ce_id,
        ce_state->src_sz_max = attr->src_sz_max;
 
        if (attr->src_nentries)
-               ce_state->send_cb = send_cb;
+               ce_state->send_cb = attr->send_cb;
 
        if (attr->dest_nentries)
-               ce_state->recv_cb = recv_cb;
+               ce_state->recv_cb = attr->recv_cb;
 
        if (attr->src_nentries) {
                ce_state->src_ring = ath10k_ce_alloc_src_ring(ar, ce_id, attr);
@@ -1141,7 +1099,6 @@ void ath10k_ce_free_pipe(struct ath10k *ar, int ce_id)
        struct ath10k_ce_pipe *ce_state = &ar_pci->ce_states[ce_id];
 
        if (ce_state->src_ring) {
-               kfree(ce_state->src_ring->shadow_base_unaligned);
                dma_free_coherent(ar->dev,
                                  (ce_state->src_ring->nentries *
                                   sizeof(struct ce_desc) +