ath10k: register per copy engine send completion callbacks
authorRajkumar Manoharan <rmanohar@qti.qualcomm.com>
Mon, 12 Oct 2015 12:57:01 +0000 (18:27 +0530)
committerKalle Valo <kvalo@qca.qualcomm.com>
Fri, 16 Oct 2015 12:49:31 +0000 (15:49 +0300)
Register send completion callbacks for every copy engines (CE) separately
instead of having common completion handler. Since some of the copy
engines delivers different type of messages, per-CE callbacks help to
service them differently.

Reviewed-by: Michal Kazior <michal.kazior@tieto.com>
Signed-off-by: Rajkumar Manoharan <rmanohar@qti.qualcomm.com>
Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
drivers/net/wireless/ath/ath10k/ce.c
drivers/net/wireless/ath/ath10k/ce.h
drivers/net/wireless/ath/ath10k/hif.h
drivers/net/wireless/ath/ath10k/htc.c
drivers/net/wireless/ath/ath10k/htc.h
drivers/net/wireless/ath/ath10k/pci.c

index 8d7ab1ccc00594b75306a8302992bf5ee5d53b4d..ae85be8297e335a040ae5d98864468239862879d 100644 (file)
@@ -1077,7 +1077,6 @@ 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 *))
 {
        struct ath10k_pci *ar_pci = ath10k_pci_priv(ar);
@@ -1104,7 +1103,7 @@ 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;
index 5c903e15dd65e6ad7da14caffb1e3a4fd8fe4bfc..3829e337b2814c252ecfc4200c85f1f7f3ff582a 100644 (file)
@@ -210,7 +210,6 @@ int ath10k_ce_init_pipe(struct ath10k *ar, unsigned int ce_id,
 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 *));
 void ath10k_ce_free_pipe(struct ath10k *ar, int ce_id);
 
@@ -277,6 +276,8 @@ struct ce_attr {
 
        /* #entries in destination ring - Must be a power of 2 */
        unsigned int dest_nentries;
+
+       void (*send_cb)(struct ath10k_ce_pipe *);
 };
 
 #define SR_BA_ADDRESS          0x0000
index 0c92e0251e84f64fd0e8b53679deda60803749f9..3808920dec80eb01d2e7cfe58e775133a5830156 100644 (file)
@@ -31,8 +31,6 @@ struct ath10k_hif_sg_item {
 };
 
 struct ath10k_hif_cb {
-       int (*tx_completion)(struct ath10k *ar,
-                            struct sk_buff *wbuf);
        int (*rx_completion)(struct ath10k *ar,
                             struct sk_buff *wbuf);
 };
index 97c24b2d65a968f92c6d37c23970f06eac670d22..89c0e40214c0f72559c03cf0145d3ab22a847799 100644 (file)
@@ -181,22 +181,20 @@ err_pull:
        return ret;
 }
 
-int ath10k_htc_tx_completion_handler(struct ath10k *ar, struct sk_buff *skb)
+void ath10k_htc_tx_completion_handler(struct ath10k *ar, struct sk_buff *skb)
 {
        struct ath10k_htc *htc = &ar->htc;
        struct ath10k_skb_cb *skb_cb;
        struct ath10k_htc_ep *ep;
 
        if (WARN_ON_ONCE(!skb))
-               return 0;
+               return;
 
        skb_cb = ATH10K_SKB_CB(skb);
        ep = &htc->endpoint[skb_cb->eid];
 
        ath10k_htc_notify_tx_completion(ep, skb);
        /* the skb now belongs to the completion handler */
-
-       return 0;
 }
 EXPORT_SYMBOL(ath10k_htc_tx_completion_handler);
 
@@ -851,7 +849,6 @@ int ath10k_htc_init(struct ath10k *ar)
 
        /* setup HIF layer callbacks */
        htc_callbacks.rx_completion = ath10k_htc_rx_completion_handler;
-       htc_callbacks.tx_completion = ath10k_htc_tx_completion_handler;
        htc->ar = ar;
 
        /* Get HIF default pipe for HTC message exchange */
index d1fc8e75efb7af057074890b988dd9c5e2b006e6..77b669ee71a085f390fba7f8cdb5d3b192da26f5 100644 (file)
@@ -355,7 +355,7 @@ int ath10k_htc_connect_service(struct ath10k_htc *htc,
 int ath10k_htc_send(struct ath10k_htc *htc, enum ath10k_htc_ep_id eid,
                    struct sk_buff *packet);
 struct sk_buff *ath10k_htc_alloc_skb(struct ath10k *ar, int size);
-int ath10k_htc_tx_completion_handler(struct ath10k *ar, struct sk_buff *skb);
+void ath10k_htc_tx_completion_handler(struct ath10k *ar, struct sk_buff *skb);
 int ath10k_htc_rx_completion_handler(struct ath10k *ar, struct sk_buff *skb);
 
 #endif
index 863117bd18ea9eb08f636a051dcf6de4dc3a3c7f..5425d85fd12bfa1ce8cf109c9e104181726932b9 100644 (file)
@@ -104,6 +104,7 @@ static int ath10k_pci_bmi_wait(struct ath10k_ce_pipe *tx_pipe,
                               struct ath10k_ce_pipe *rx_pipe,
                               struct bmi_xfer *xfer);
 static int ath10k_pci_qca99x0_chip_reset(struct ath10k *ar);
+static void ath10k_pci_htc_tx_cb(struct ath10k_ce_pipe *ce_state);
 
 static const struct ce_attr host_ce_config_wlan[] = {
        /* CE0: host->target HTC control and raw streams */
@@ -112,6 +113,7 @@ static const struct ce_attr host_ce_config_wlan[] = {
                .src_nentries = 16,
                .src_sz_max = 256,
                .dest_nentries = 0,
+               .send_cb = ath10k_pci_htc_tx_cb,
        },
 
        /* CE1: target->host HTT + HTC control */
@@ -136,6 +138,7 @@ static const struct ce_attr host_ce_config_wlan[] = {
                .src_nentries = 32,
                .src_sz_max = 2048,
                .dest_nentries = 0,
+               .send_cb = ath10k_pci_htc_tx_cb,
        },
 
        /* CE4: host->target HTT */
@@ -144,6 +147,7 @@ static const struct ce_attr host_ce_config_wlan[] = {
                .src_nentries = CE_HTT_H2T_MSG_SRC_NENTRIES,
                .src_sz_max = 256,
                .dest_nentries = 0,
+               .send_cb = ath10k_pci_htc_tx_cb,
        },
 
        /* CE5: unused */
@@ -1095,11 +1099,9 @@ static int ath10k_pci_diag_write32(struct ath10k *ar, u32 address, u32 value)
 }
 
 /* Called by lower (CE) layer when a send to Target completes. */
-static void ath10k_pci_ce_send_done(struct ath10k_ce_pipe *ce_state)
+static void ath10k_pci_htc_tx_cb(struct ath10k_ce_pipe *ce_state)
 {
        struct ath10k *ar = ce_state->ar;
-       struct ath10k_pci *ar_pci = ath10k_pci_priv(ar);
-       struct ath10k_hif_cb *cb = &ar_pci->msg_callbacks_current;
        struct sk_buff_head list;
        struct sk_buff *skb;
        u32 ce_data;
@@ -1117,7 +1119,7 @@ static void ath10k_pci_ce_send_done(struct ath10k_ce_pipe *ce_state)
        }
 
        while ((skb = __skb_dequeue(&list)))
-               cb->tx_completion(ar, skb);
+               ath10k_htc_tx_completion_handler(ar, skb);
 }
 
 /* Called by lower (CE) layer when data is received from the Target. */
@@ -1573,7 +1575,7 @@ static void ath10k_pci_tx_pipe_cleanup(struct ath10k_pci_pipe *pci_pipe)
 
                ce_ring->per_transfer_context[i] = NULL;
 
-               ar_pci->msg_callbacks_current.tx_completion(ar, skb);
+               ath10k_htc_tx_completion_handler(ar, skb);
        }
 }
 
@@ -1994,7 +1996,6 @@ static int ath10k_pci_alloc_pipes(struct ath10k *ar)
                pipe->hif_ce_state = ar;
 
                ret = ath10k_ce_alloc_pipe(ar, i, &host_ce_config_wlan[i],
-                                          ath10k_pci_ce_send_done,
                                           ath10k_pci_ce_recv_data);
                if (ret) {
                        ath10k_err(ar, "failed to allocate copy engine pipe %d: %d\n",