summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLeo Chang <schang@qca.qualcomm.com>2014-08-14 08:52:15 -0700
committerPitani Venkata Rajesh Kumar <c_vpitan@qti.qualcomm.com>2014-08-23 11:51:36 +0530
commit198c3f8eb52781de0bee49d890db8728aa30a685 (patch)
treebfb40a496e92fcc29a20589e2ed6d09a43cf8a03
parentc1def62a1e2ad3567e7adb77ad8f15e712a48a27 (diff)
qca-cld: ipa uc: dp add ipa uc stats query
For debugging purpose, IPA UC stats query function is needed. If query function called WLAN Firmware stats IPA UC stats WLAN host stats will be displayed on kernel log Change-Id: Ibf198ebfc33022e52cd1d01cab2e3ccbf3f26843 CRs-fixed: 709748
-rw-r--r--CORE/CLD_TXRX/HTT/htt_h2t.c54
-rw-r--r--CORE/CLD_TXRX/HTT/htt_t2h.c38
-rw-r--r--CORE/CLD_TXRX/HTT/htt_tx.c5
-rw-r--r--CORE/CLD_TXRX/TLSHIM/tl_shim.c15
-rw-r--r--CORE/CLD_TXRX/TLSHIM/tl_shim.h5
-rw-r--r--CORE/CLD_TXRX/TXRX/ol_txrx.c9
-rw-r--r--CORE/CLD_TXRX/TXRX/ol_txrx_types.h2
-rw-r--r--CORE/SERVICES/COMMON/ol_htt_api.h8
-rw-r--r--CORE/SERVICES/COMMON/ol_txrx_ctrl_api.h17
-rw-r--r--CORE/SERVICES/WMA/wma.c12
-rw-r--r--CORE/SERVICES/WMA/wma.h1
-rw-r--r--CORE/TL/inc/wlan_qct_tl.h2
12 files changed, 133 insertions, 35 deletions
diff --git a/CORE/CLD_TXRX/HTT/htt_h2t.c b/CORE/CLD_TXRX/HTT/htt_h2t.c
index 70c7aedadab2..78cf63ee2767 100644
--- a/CORE/CLD_TXRX/HTT/htt_h2t.c
+++ b/CORE/CLD_TXRX/HTT/htt_h2t.c
@@ -871,5 +871,59 @@ int htt_h2t_ipa_uc_set_active(struct htt_pdev_t *pdev,
return A_OK;
}
+
+
+int htt_h2t_ipa_uc_get_stats(struct htt_pdev_t *pdev)
+{
+ struct htt_htc_pkt *pkt;
+ adf_nbuf_t msg;
+ u_int32_t *msg_word;
+
+ pkt = htt_htc_pkt_alloc(pdev);
+ if (!pkt) {
+ return A_NO_MEMORY;
+ }
+
+ /* show that this is not a tx frame download (not required, but helpful) */
+ pkt->msdu_id = HTT_TX_COMPL_INV_MSDU_ID;
+ pkt->pdev_ctxt = NULL; /* not used during send-done callback */
+
+ msg = adf_nbuf_alloc(
+ pdev->osdev,
+ HTT_MSG_BUF_SIZE(HTT_WDI_IPA_OP_REQUEST_SZ),
+ /* reserve room for HTC header */
+ HTC_HEADER_LEN + HTC_HDR_ALIGNMENT_PADDING, 4, FALSE);
+ if (!msg) {
+ htt_htc_pkt_free(pdev, pkt);
+ return A_NO_MEMORY;
+ }
+ /* set the length of the message */
+ adf_nbuf_put_tail(msg, HTT_WDI_IPA_OP_REQUEST_SZ);
+
+ /* fill in the message contents */
+ msg_word = (u_int32_t *) adf_nbuf_data(msg);
+
+ /* rewind beyond alignment pad to get to the HTC header reserved area */
+ adf_nbuf_push_head(msg, HTC_HDR_ALIGNMENT_PADDING);
+
+ *msg_word = 0;
+ HTT_WDI_IPA_OP_REQUEST_OP_CODE_SET(*msg_word,
+ HTT_WDI_IPA_OPCODE_DBG_STATS);
+ HTT_H2T_MSG_TYPE_SET(*msg_word, HTT_H2T_MSG_TYPE_WDI_IPA_OP_REQ);
+
+ SET_HTC_PACKET_INFO_TX(
+ &pkt->htc_pkt,
+ htt_h2t_send_complete_free_netbuf,
+ adf_nbuf_data(msg),
+ adf_nbuf_len(msg),
+ pdev->htc_endpoint,
+ 1); /* tag - not relevant here */
+
+ SET_HTC_PACKET_NET_BUF_CONTEXT(&pkt->htc_pkt, msg);
+
+ HTCSendPkt(pdev->htc_pdev, &pkt->htc_pkt);
+
+ return A_OK;
+}
#endif /* IPA_UC_OFFLOAD */
diff --git a/CORE/CLD_TXRX/HTT/htt_t2h.c b/CORE/CLD_TXRX/HTT/htt_t2h.c
index 2593ff29377e..825d0c312075 100644
--- a/CORE/CLD_TXRX/HTT/htt_t2h.c
+++ b/CORE/CLD_TXRX/HTT/htt_t2h.c
@@ -345,6 +345,33 @@ htt_t2h_lp_msg_handler(void *context, adf_nbuf_t htt_t2h_msg )
break;
}
+#ifdef IPA_UC_OFFLOAD
+ case HTT_T2H_MSG_TYPE_WDI_IPA_OP_RESPONSE:
+ {
+ u_int8_t op_code;
+ u_int16_t len;
+ u_int8_t *op_msg_buffer;
+ u_int8_t *msg_start_ptr;
+
+ msg_start_ptr = (u_int8_t *)msg_word;
+ op_code = HTT_WDI_IPA_OP_RESPONSE_OP_CODE_GET(*msg_word);
+ msg_word++;
+ len = HTT_WDI_IPA_OP_RESPONSE_RSP_LEN_GET(*msg_word);
+
+ op_msg_buffer = adf_os_mem_alloc(NULL,
+ sizeof(struct htt_wdi_ipa_op_response_t) + len);
+ if (!op_msg_buffer) {
+ adf_os_print("OPCODE messsage buffer alloc fail");
+ break;
+ }
+ adf_os_mem_copy(op_msg_buffer,
+ msg_start_ptr,
+ sizeof(struct htt_wdi_ipa_op_response_t) + len);
+ ol_txrx_ipa_uc_op_response(pdev->txrx_pdev, op_msg_buffer);
+ break;
+ }
+#endif /* IPA_UC_OFFLOAD */
+
default:
break;
};
@@ -545,17 +572,6 @@ if (adf_os_unlikely(pdev->rx_ring.rx_reset)) {
break;
}
-#ifdef IPA_UC_OFFLOAD
- case HTT_T2H_MSG_TYPE_WDI_IPA_OP_RESPONSE:
- {
- u_int8_t op_code;
-
- op_code = HTT_WDI_IPA_OP_RESPONSE_OP_CODE_GET(*msg_word);
- ol_txrx_ipa_uc_op_response(pdev->txrx_pdev, op_code);
- break;
- }
-#endif /* IPA_UC_OFFLOAD */
-
default:
htt_t2h_lp_msg_handler(context, htt_t2h_msg);
return ;
diff --git a/CORE/CLD_TXRX/HTT/htt_tx.c b/CORE/CLD_TXRX/HTT/htt_tx.c
index 286f8a0d499e..bece21d4d906 100644
--- a/CORE/CLD_TXRX/HTT/htt_tx.c
+++ b/CORE/CLD_TXRX/HTT/htt_tx.c
@@ -665,9 +665,6 @@ int htt_tx_ipa_uc_attach(struct htt_pdev_t *pdev,
*header_ptr = buffer_paddr + 32;
*ring_vaddr = buffer_paddr;
- printk("TX RING vADD %lx BF pADDR %x buffer_paddr %x buffer_vaddr %lx\n",
- (unsigned long)ring_vaddr, (unsigned int)(*ring_vaddr),
- (unsigned int)buffer_paddr, (unsigned long)adf_nbuf_data(buffer_vaddr));
pdev->ipa_uc_tx_rsc.tx_buf_pool_vaddr_strg[tx_buffer_count] =
buffer_vaddr;
/* Memory barrier to ensure actual value updated */
@@ -675,8 +672,6 @@ int htt_tx_ipa_uc_attach(struct htt_pdev_t *pdev,
ring_vaddr++;
}
- adf_os_print("%s: Allocated TX buffer count is %d\n",
- __func__, tx_buffer_count);
pdev->ipa_uc_tx_rsc.alloc_tx_buf_cnt = tx_buffer_count;
return 0;
diff --git a/CORE/CLD_TXRX/TLSHIM/tl_shim.c b/CORE/CLD_TXRX/TLSHIM/tl_shim.c
index f4c3969c83db..157fc7d1956d 100644
--- a/CORE/CLD_TXRX/TLSHIM/tl_shim.c
+++ b/CORE/CLD_TXRX/TLSHIM/tl_shim.c
@@ -2433,7 +2433,6 @@ void WLANTL_IpaUcFwOpEventHandler(void *context,
void *rxpkt,
u_int16_t staid)
{
- v_U8_t op_code;
struct txrx_tl_shim_ctx *tl_shim = (struct txrx_tl_shim_ctx *)context;
if (!tl_shim) {
@@ -2441,10 +2440,8 @@ void WLANTL_IpaUcFwOpEventHandler(void *context,
return;
}
- vos_mem_copy(&op_code, rxpkt, 1);
- TLSHIM_LOGD("%s, opcode %d", __func__, op_code);
if (tl_shim->fw_op_cb) {
- tl_shim->fw_op_cb(op_code);
+ tl_shim->fw_op_cb(rxpkt, tl_shim->usr_ctxt);
}
}
@@ -2468,11 +2465,10 @@ void WLANTL_IpaUcFwOpEventHandler(void *context,
SIDE EFFECTS
==============================================================================*/
-void WLANTL_IpaUcOpEventHandler(v_U8_t op_code, void *shim_ctxt)
+void WLANTL_IpaUcOpEventHandler(v_U8_t *op_msg, void *shim_ctxt)
{
pVosSchedContext sched_ctx = get_vos_sched_ctxt();
struct VosTlshimPkt *pkt;
- v_U8_t *op_code_pkt;
if (unlikely(!sched_ctx))
return;
@@ -2483,11 +2479,9 @@ void WLANTL_IpaUcOpEventHandler(v_U8_t op_code, void *shim_ctxt)
return;
}
- op_code_pkt = (v_U8_t *)vos_mem_malloc(4);
- vos_mem_copy(op_code_pkt, &op_code, 1);
pkt->callback = (vos_tlshim_cb) WLANTL_IpaUcFwOpEventHandler;
pkt->context = shim_ctxt;
- pkt->Rxpkt = (void *) op_code_pkt;
+ pkt->Rxpkt = (void *)op_msg;
pkt->staId = 0;
vos_indicate_rxpkt(sched_ctx, pkt);
}
@@ -2510,7 +2504,7 @@ void WLANTL_IpaUcOpEventHandler(v_U8_t op_code, void *shim_ctxt)
==============================================================================*/
void WLANTL_RegisterOPCbFnc(void *vos_ctx,
- void (*func)(v_U8_t op_code))
+ void (*func)(v_U8_t *op_msg, void *usr_ctxt), void *usr_ctxt)
{
struct txrx_tl_shim_ctx *tl_shim;
@@ -2526,6 +2520,7 @@ void WLANTL_RegisterOPCbFnc(void *vos_ctx,
}
tl_shim->fw_op_cb = func;
+ tl_shim->usr_ctxt = usr_ctxt;
wdi_in_ipa_uc_register_op_cb(((pVosContextType)vos_ctx)->pdev_txrx_ctx,
WLANTL_IpaUcOpEventHandler, (void *)tl_shim);
}
diff --git a/CORE/CLD_TXRX/TLSHIM/tl_shim.h b/CORE/CLD_TXRX/TLSHIM/tl_shim.h
index 3eedfe3a31f7..100e1edc4b7c 100644
--- a/CORE/CLD_TXRX/TLSHIM/tl_shim.h
+++ b/CORE/CLD_TXRX/TLSHIM/tl_shim.h
@@ -71,7 +71,7 @@ struct tlshim_session_flow_Control {
#endif /* QCA_LL_TX_FLOW_CT */
#ifdef IPA_UC_OFFLOAD
-typedef void(*ipa_uc_fw_op_cb)(v_U8_t op_code);
+typedef void(*ipa_uc_fw_op_cb)(v_U8_t *op_msg, void *usr_ctxt);
#endif /* IPA_UC_OFFLOAD */
struct txrx_tl_shim_ctx {
@@ -103,7 +103,8 @@ struct deferred_iapp_work iapp_work;
vos_event_t *peer_authorized_events;
#endif
#ifdef IPA_UC_OFFLOAD
- ipa_uc_fw_op_cb fw_op_cb;;
+ ipa_uc_fw_op_cb fw_op_cb;
+ void *usr_ctxt;
#endif /* IPA_UC_OFFLOAD */
};
diff --git a/CORE/CLD_TXRX/TXRX/ol_txrx.c b/CORE/CLD_TXRX/TXRX/ol_txrx.c
index b50f9695b6f4..f3f3ac511d29 100644
--- a/CORE/CLD_TXRX/TXRX/ol_txrx.c
+++ b/CORE/CLD_TXRX/TXRX/ol_txrx.c
@@ -2096,11 +2096,11 @@ ol_txrx_ipa_uc_set_active(
void
ol_txrx_ipa_uc_op_response(
ol_txrx_pdev_handle pdev,
- u_int8_t op_code
+ u_int8_t *op_msg
)
{
if (pdev->ipa_uc_op_cb) {
- pdev->ipa_uc_op_cb(op_code, pdev->osif_dev);
+ pdev->ipa_uc_op_cb(op_msg, pdev->osif_dev);
}
}
@@ -2113,5 +2113,10 @@ void ol_txrx_ipa_uc_register_op_cb(
pdev->osif_dev = osif_dev;
}
+void ol_txrx_ipa_uc_get_stat(ol_txrx_pdev_handle pdev)
+{
+ htt_h2t_ipa_uc_get_stats(pdev->htt_pdev);
+}
+
#endif /* IPA_UC_OFFLOAD */
diff --git a/CORE/CLD_TXRX/TXRX/ol_txrx_types.h b/CORE/CLD_TXRX/TXRX/ol_txrx_types.h
index 8c89d21eb69d..5559a67da227 100644
--- a/CORE/CLD_TXRX/TXRX/ol_txrx_types.h
+++ b/CORE/CLD_TXRX/TXRX/ol_txrx_types.h
@@ -322,7 +322,7 @@ typedef enum _throttle_phase {
#define THROTTLE_TX_THRESHOLD (100)
#ifdef IPA_UC_OFFLOAD
-typedef void (*ipa_uc_op_cb_type)(u_int8_t op_code, void *osif_ctxt);
+typedef void (*ipa_uc_op_cb_type)(u_int8_t *op_msg, void *osif_ctxt);
#endif /* IPA_UC_OFFLOAD */
/*
diff --git a/CORE/SERVICES/COMMON/ol_htt_api.h b/CORE/SERVICES/COMMON/ol_htt_api.h
index 5e26c0d089e1..3df24b466b39 100644
--- a/CORE/SERVICES/COMMON/ol_htt_api.h
+++ b/CORE/SERVICES/COMMON/ol_htt_api.h
@@ -289,6 +289,14 @@ htt_h2t_ipa_uc_set_active(struct htt_pdev_t *pdev,
a_bool_t is_tx);
/**
+ * @brief query uc data path stats
+ *
+ * @param pdev - handle to the HTT instance
+ */
+int
+htt_h2t_ipa_uc_get_stats(struct htt_pdev_t *pdev);
+
+/**
* @brief Attach IPA UC data path
*
* @param pdev - handle to the HTT instance
diff --git a/CORE/SERVICES/COMMON/ol_txrx_ctrl_api.h b/CORE/SERVICES/COMMON/ol_txrx_ctrl_api.h
index 651f15e3140e..730b350ee009 100644
--- a/CORE/SERVICES/COMMON/ol_txrx_ctrl_api.h
+++ b/CORE/SERVICES/COMMON/ol_txrx_ctrl_api.h
@@ -1180,7 +1180,7 @@ ol_txrx_ipa_uc_set_active(
void
ol_txrx_ipa_uc_op_response(
ol_txrx_pdev_handle pdev,
- u_int8_t op_code);
+ u_int8_t *op_msg);
/**
* @brief callback function registration
@@ -1195,8 +1195,17 @@ ol_txrx_ipa_uc_op_response(
*/
void ol_txrx_ipa_uc_register_op_cb(
ol_txrx_pdev_handle pdev,
- void (*ipa_uc_op_cb_type)(u_int8_t op_code, void *osif_ctxt),
+ void (*ipa_uc_op_cb_type)(u_int8_t *op_msg, void *osif_ctxt),
void *osif_dev);
+
+/**
+ * @brief query uc data path stats
+ * @details
+ * Query uc data path stats from firmware
+ *
+ * @param pdev - handle to the HTT instance
+ */
+void ol_txrx_ipa_uc_get_stat(ol_txrx_pdev_handle pdev);
#else
#define ol_txrx_ipa_uc_get_resource( \
pdev, \
@@ -1222,12 +1231,14 @@ void ol_txrx_ipa_uc_register_op_cb(
#define ol_txrx_ipa_uc_op_response( \
pdev, \
- op_code) /* NO-OP */
+ op_data) /* NO-OP */
#define ol_txrx_ipa_uc_register_op_cb( \
pdev, \
ipa_uc_op_cb_type, \
osif_dev) /* NO-OP */
+
+#define ol_txrx_ipa_uc_get_stat(pdev) /* NO-OP */
#endif /* IPA_UC_OFFLOAD */
#endif /* _OL_TXRX_CTRL_API__H_ */
diff --git a/CORE/SERVICES/WMA/wma.c b/CORE/SERVICES/WMA/wma.c
index 288271968239..d83fb1441333 100644
--- a/CORE/SERVICES/WMA/wma.c
+++ b/CORE/SERVICES/WMA/wma.c
@@ -10687,6 +10687,18 @@ static int32_t wma_set_priv_cfg(tp_wma_handle wma_handle,
}
break;
+#ifdef IPA_UC_OFFLOAD
+ case WMA_VDEV_TXRX_GET_IPA_UC_FW_STATS_CMDID:
+ {
+ ol_txrx_pdev_handle pdev;
+
+ pdev = vos_get_context(VOS_MODULE_ID_TXRX,
+ wma_handle->vos_context);
+ ol_txrx_ipa_uc_get_stat(pdev);
+ }
+ break;
+#endif /* IPA_UC_OFFLOAD */
+
default:
WMA_LOGE("Invalid wma config command id:%d",
privcmd->param_id);
diff --git a/CORE/SERVICES/WMA/wma.h b/CORE/SERVICES/WMA/wma.h
index 2993760cbfaa..efe014609580 100644
--- a/CORE/SERVICES/WMA/wma.h
+++ b/CORE/SERVICES/WMA/wma.h
@@ -1207,6 +1207,7 @@ enum wma_cfg_cmd_id {
/* dfs control interface */
WMA_VDEV_DFS_CONTROL_CMDID,
+ WMA_VDEV_TXRX_GET_IPA_UC_FW_STATS_CMDID,
/* Add any new command before this */
WMA_CMD_ID_MAX
diff --git a/CORE/TL/inc/wlan_qct_tl.h b/CORE/TL/inc/wlan_qct_tl.h
index f12ae7752024..186fc8f86dc3 100644
--- a/CORE/TL/inc/wlan_qct_tl.h
+++ b/CORE/TL/inc/wlan_qct_tl.h
@@ -3198,6 +3198,6 @@ void WLANTL_SetUcActive(void *vos_ctx,
==============================================================================*/
void WLANTL_RegisterOPCbFnc(void *vos_ctx,
- void (*func)(v_U8_t op_code));
+ void (*func)(v_U8_t *op_msg, void *usr_ctxt), void *usr_ctxt);
#endif /* IPA_UC_OFFLOAD */
#endif /* #ifndef WLAN_QCT_WLANTL_H */