summaryrefslogtreecommitdiff
path: root/hif
diff options
context:
space:
mode:
authorNachiket Kukade <nkukade@codeaurora.org>2017-09-07 17:16:12 +0530
committersnandini <snandini@codeaurora.org>2017-10-05 09:20:03 -0700
commite5738b5a877d26f07ee9513891ed4d6e4dc731c8 (patch)
tree78a462445079911f13a78701644112902af03026 /hif
parentae820d08e5a0f2da214e55e929c43d707d6c6465 (diff)
downloadqca-wfi-host-cmn-e5738b5a877d26f07ee9513891ed4d6e4dc731c8.tar.gz
qcacmn: Return proper error status from modules under hif_start
Some of the HIF API's that do buffer allocations and operations return either 0 or 1 as return status. Information is lost since the same value is returned in case of buffer allocation failures, queue operation failure or anything else. Caller can't decide if to perform recovery, graceful failure or BUG_ON. Return the appropriate error status to the callers. Change-Id: Idccd3968231d030311fa5581aed78849b729227d CRs-Fixed: 2105913
Diffstat (limited to 'hif')
-rw-r--r--hif/src/ce/ce_main.c49
1 files changed, 25 insertions, 24 deletions
diff --git a/hif/src/ce/ce_main.c b/hif/src/ce/ce_main.c
index ed3084069..73dcecd51 100644
--- a/hif/src/ce/ce_main.c
+++ b/hif/src/ce/ce_main.c
@@ -64,7 +64,7 @@
#endif
/* Forward references */
-static int hif_post_recv_buffers_for_pipe(struct HIF_CE_pipe_info *pipe_info);
+QDF_STATUS hif_post_recv_buffers_for_pipe(struct HIF_CE_pipe_info *pipe_info);
/*
* Fix EV118783, poll to check whether a BMI response comes
@@ -88,7 +88,7 @@ static int hif_post_recv_buffers_for_pipe(struct HIF_CE_pipe_info *pipe_info);
#endif /* ENABLE_10_4_FW_HDR */
#endif
-static int hif_post_recv_buffers(struct hif_softc *scn);
+QDF_STATUS hif_post_recv_buffers(struct hif_softc *scn);
static void hif_config_rri_on_ddr(struct hif_softc *scn);
/**
@@ -1814,18 +1814,18 @@ static void hif_post_recv_buffers_failure(struct HIF_CE_pipe_info *pipe_info,
-static int hif_post_recv_buffers_for_pipe(struct HIF_CE_pipe_info *pipe_info)
+QDF_STATUS hif_post_recv_buffers_for_pipe(struct HIF_CE_pipe_info *pipe_info)
{
struct CE_handle *ce_hdl;
qdf_size_t buf_sz;
struct hif_softc *scn = HIF_GET_SOFTC(pipe_info->HIF_CE_state);
- QDF_STATUS ret;
+ QDF_STATUS status;
uint32_t bufs_posted = 0;
buf_sz = pipe_info->buf_sz;
if (buf_sz == 0) {
/* Unused Copy Engine */
- return 0;
+ return QDF_STATUS_SUCCESS;
}
ce_hdl = pipe_info->ce_hdl;
@@ -1834,7 +1834,6 @@ static int hif_post_recv_buffers_for_pipe(struct HIF_CE_pipe_info *pipe_info)
while (atomic_read(&pipe_info->recv_bufs_needed) > 0) {
qdf_dma_addr_t CE_data; /* CE space buffer address */
qdf_nbuf_t nbuf;
- int status;
atomic_dec(&pipe_info->recv_bufs_needed);
qdf_spin_unlock_bh(&pipe_info->recv_bufs_needed_lock);
@@ -1845,7 +1844,7 @@ static int hif_post_recv_buffers_for_pipe(struct HIF_CE_pipe_info *pipe_info)
&pipe_info->nbuf_alloc_err_count,
HIF_RX_NBUF_ALLOC_FAILURE,
"HIF_RX_NBUF_ALLOC_FAILURE");
- return 1;
+ return QDF_STATUS_E_NOMEM;
}
/*
@@ -1853,16 +1852,16 @@ static int hif_post_recv_buffers_for_pipe(struct HIF_CE_pipe_info *pipe_info)
* CE_data = dma_map_single(dev, data, buf_sz, );
* DMA_FROM_DEVICE);
*/
- ret = qdf_nbuf_map_single(scn->qdf_dev, nbuf,
+ status = qdf_nbuf_map_single(scn->qdf_dev, nbuf,
QDF_DMA_FROM_DEVICE);
- if (unlikely(ret != QDF_STATUS_SUCCESS)) {
+ if (qdf_unlikely(status != QDF_STATUS_SUCCESS)) {
hif_post_recv_buffers_failure(pipe_info, nbuf,
&pipe_info->nbuf_dma_err_count,
HIF_RX_NBUF_MAP_FAILURE,
"HIF_RX_NBUF_MAP_FAILURE");
qdf_nbuf_free(nbuf);
- return 1;
+ return status;
}
CE_data = qdf_nbuf_get_frag_paddr(nbuf, 0);
@@ -1870,8 +1869,7 @@ static int hif_post_recv_buffers_for_pipe(struct HIF_CE_pipe_info *pipe_info)
qdf_mem_dma_sync_single_for_device(scn->qdf_dev, CE_data,
buf_sz, DMA_FROM_DEVICE);
status = ce_recv_buf_enqueue(ce_hdl, (void *)nbuf, CE_data);
- QDF_ASSERT(status == QDF_STATUS_SUCCESS);
- if (unlikely(status != EOK)) {
+ if (qdf_unlikely(status != QDF_STATUS_SUCCESS)) {
hif_post_recv_buffers_failure(pipe_info, nbuf,
&pipe_info->nbuf_ce_enqueue_err_count,
HIF_RX_NBUF_ENQUEUE_FAILURE,
@@ -1880,7 +1878,7 @@ static int hif_post_recv_buffers_for_pipe(struct HIF_CE_pipe_info *pipe_info)
qdf_nbuf_unmap_single(scn->qdf_dev, nbuf,
QDF_DMA_FROM_DEVICE);
qdf_nbuf_free(nbuf);
- return 1;
+ return status;
}
qdf_spin_lock_bh(&pipe_info->recv_bufs_needed_lock);
@@ -1898,7 +1896,7 @@ static int hif_post_recv_buffers_for_pipe(struct HIF_CE_pipe_info *pipe_info)
qdf_spin_unlock_bh(&pipe_info->recv_bufs_needed_lock);
- return 0;
+ return QDF_STATUS_SUCCESS;
}
/*
@@ -1908,11 +1906,12 @@ static int hif_post_recv_buffers_for_pipe(struct HIF_CE_pipe_info *pipe_info)
* failures, non-zero if unable to completely replenish
* receive buffers for fastpath rx Copy engine.
*/
-static int hif_post_recv_buffers(struct hif_softc *scn)
+QDF_STATUS hif_post_recv_buffers(struct hif_softc *scn)
{
struct HIF_CE_state *hif_state = HIF_GET_CE_STATE(scn);
- int pipe_num, rv = 0;
+ int pipe_num;
struct CE_state *ce_state;
+ QDF_STATUS qdf_status;
A_TARGET_ACCESS_LIKELY(scn);
for (pipe_num = 0; pipe_num < scn->ce_count; pipe_num++) {
@@ -1925,24 +1924,25 @@ static int hif_post_recv_buffers(struct hif_softc *scn)
ce_state && (ce_state->htt_rx_data))
continue;
- if (hif_post_recv_buffers_for_pipe(pipe_info) &&
+ qdf_status = hif_post_recv_buffers_for_pipe(pipe_info);
+ if (!QDF_IS_STATUS_SUCCESS(qdf_status) &&
ce_state->htt_rx_data &&
scn->fastpath_mode_on) {
- rv = 1;
- goto done;
+ A_TARGET_ACCESS_UNLIKELY(scn);
+ return qdf_status;
}
}
-done:
A_TARGET_ACCESS_UNLIKELY(scn);
- return rv;
+ return QDF_STATUS_SUCCESS;
}
QDF_STATUS hif_start(struct hif_opaque_softc *hif_ctx)
{
struct hif_softc *scn = HIF_GET_SOFTC(hif_ctx);
struct HIF_CE_state *hif_state = HIF_GET_CE_STATE(scn);
+ QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
hif_update_fastpath_recv_bufs_cnt(scn);
@@ -1955,13 +1955,14 @@ QDF_STATUS hif_start(struct hif_opaque_softc *hif_ctx)
hif_state->started = true;
/* Post buffers once to start things off. */
- if (hif_post_recv_buffers(scn)) {
+ qdf_status = hif_post_recv_buffers(scn);
+ if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
/* cleanup is done in hif_ce_disable */
HIF_ERROR("%s:failed to post buffers", __func__);
- return QDF_STATUS_E_FAILURE;
+ return qdf_status;
}
- return QDF_STATUS_SUCCESS;
+ return qdf_status;
}
static void hif_recv_buffer_cleanup_on_pipe(struct HIF_CE_pipe_info *pipe_info)