qcacld-3.0: Record polled completion processing
Since the wmi tx copy engine's completions can be processed in both its tasklet context and through ce_per_engine_servicereap on a polled basis, we wish to be able to distinguish the when each is used. Change-Id: I5892eeeab4e1c7e4c35b958d98db7ad0293ec24f CRs-Fixed: 951569
This commit is contained in:

committed by
Akash Patel

parent
d93b804d66
commit
c9f2a429a0
@@ -298,6 +298,8 @@ union ce_desc {
|
|||||||
* @HIF_CE_TASKLET_ENTRY: records the start of the ce_tasklet
|
* @HIF_CE_TASKLET_ENTRY: records the start of the ce_tasklet
|
||||||
* @HIF_CE_TASKLET_RESCHEDULE: records the rescheduling of the wlan_tasklet
|
* @HIF_CE_TASKLET_RESCHEDULE: records the rescheduling of the wlan_tasklet
|
||||||
* @HIF_CE_TASKLET_EXIT: records the exit of the wlan tasklet without reschedule
|
* @HIF_CE_TASKLET_EXIT: records the exit of the wlan tasklet without reschedule
|
||||||
|
* @HIF_CE_REAP_ENTRY: records when we process completion outside of a bh
|
||||||
|
* @HIF_CE_REAP_EXIT: records when we process completion outside of a bh
|
||||||
*/
|
*/
|
||||||
enum hif_ce_event_type {
|
enum hif_ce_event_type {
|
||||||
HIF_RX_DESC_POST,
|
HIF_RX_DESC_POST,
|
||||||
@@ -309,6 +311,8 @@ enum hif_ce_event_type {
|
|||||||
HIF_CE_TASKLET_ENTRY,
|
HIF_CE_TASKLET_ENTRY,
|
||||||
HIF_CE_TASKLET_RESCHEDULE,
|
HIF_CE_TASKLET_RESCHEDULE,
|
||||||
HIF_CE_TASKLET_EXIT,
|
HIF_CE_TASKLET_EXIT,
|
||||||
|
HIF_CE_REAP_ENTRY,
|
||||||
|
HIF_CE_REAP_EXIT,
|
||||||
};
|
};
|
||||||
|
|
||||||
void ce_init_ce_desc_event_log(int ce_id, int size);
|
void ce_init_ce_desc_event_log(int ce_id, int size);
|
||||||
|
@@ -1181,7 +1181,7 @@ ce_completed_send_next(struct CE_handle *copyeng,
|
|||||||
* within it .
|
* within it .
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void ce_per_engine_servicereap(struct ol_softc *scn, unsigned int CE_id)
|
void ce_per_engine_servicereap(struct ol_softc *scn, unsigned int ce_id)
|
||||||
{
|
{
|
||||||
void *CE_context;
|
void *CE_context;
|
||||||
void *transfer_context;
|
void *transfer_context;
|
||||||
@@ -1190,9 +1190,11 @@ void ce_per_engine_servicereap(struct ol_softc *scn, unsigned int CE_id)
|
|||||||
unsigned int id;
|
unsigned int id;
|
||||||
unsigned int sw_idx, hw_idx;
|
unsigned int sw_idx, hw_idx;
|
||||||
uint32_t toeplitz_hash_result;
|
uint32_t toeplitz_hash_result;
|
||||||
struct CE_state *CE_state = scn->ce_id_to_state[CE_id];
|
struct CE_state *CE_state = scn->ce_id_to_state[ce_id];
|
||||||
|
|
||||||
A_TARGET_ACCESS_BEGIN(scn);
|
A_TARGET_ACCESS_BEGIN(scn);
|
||||||
|
hif_record_ce_desc_event(ce_id, HIF_CE_REAP_ENTRY,
|
||||||
|
NULL, NULL, 0);
|
||||||
|
|
||||||
/* Since this function is called from both user context and
|
/* Since this function is called from both user context and
|
||||||
* tasklet context the spinlock has to lock the bottom halves.
|
* tasklet context the spinlock has to lock the bottom halves.
|
||||||
@@ -1220,7 +1222,7 @@ void ce_per_engine_servicereap(struct ol_softc *scn, unsigned int CE_id)
|
|||||||
&nbytes, &id, &sw_idx, &hw_idx,
|
&nbytes, &id, &sw_idx, &hw_idx,
|
||||||
&toeplitz_hash_result) ==
|
&toeplitz_hash_result) ==
|
||||||
CDF_STATUS_SUCCESS) {
|
CDF_STATUS_SUCCESS) {
|
||||||
if (CE_id != CE_HTT_H2T_MSG) {
|
if (ce_id != CE_HTT_H2T_MSG) {
|
||||||
cdf_spin_unlock_bh(
|
cdf_spin_unlock_bh(
|
||||||
&CE_state->ce_index_lock);
|
&CE_state->ce_index_lock);
|
||||||
CE_state->send_cb(
|
CE_state->send_cb(
|
||||||
@@ -1247,6 +1249,9 @@ void ce_per_engine_servicereap(struct ol_softc *scn, unsigned int CE_id)
|
|||||||
}
|
}
|
||||||
|
|
||||||
cdf_spin_unlock_bh(&CE_state->ce_index_lock);
|
cdf_spin_unlock_bh(&CE_state->ce_index_lock);
|
||||||
|
|
||||||
|
hif_record_ce_desc_event(ce_id, HIF_CE_REAP_EXIT,
|
||||||
|
NULL, NULL, 0);
|
||||||
A_TARGET_ACCESS_END(scn);
|
A_TARGET_ACCESS_END(scn);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user