qcacmn: Add unit test framework to validate WLAN suspend/resume features
WLAN suspend/resume feature has tight dependency on APPS platform suspend/resume support. On new targets APPS suspend/resume is not supported until target is feature complete. In absence of APPS suspend/resume support testing WLAN offload features become difficult. Add unit test framework to test WLAN suspend/resume features using private IOCTL command by simulating APPS suspend/resume behaviour. Trigger WLAN suspend: iwpriv wlan0 wlan_suspend 0 0 To resume WLAN run a ping test from access point side and very 1st ping request unicast packet should trigger wake up. If FW is not waking up APPS then use below command to do a manual wake up: Trigger WLAN resume: iwpriv wlan0 wlan_resume 0 0 This framework is only for SNOC platform. Change-Id: I177a0047f460aa2a305a9e4e46fbfaa94a81dced CRs-Fixed: 1042205
This commit is contained in:

committed by
Vishwajith Upendra

parent
3e52419f67
commit
5bac30f5e6
@@ -615,6 +615,11 @@ uint32_t hif_set_nss_wifiol_mode(struct hif_opaque_softc *osc,
|
|||||||
int32_t hif_get_nss_wifiol_bypass_nw_process(struct hif_opaque_softc *osc);
|
int32_t hif_get_nss_wifiol_bypass_nw_process(struct hif_opaque_softc *osc);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef WLAN_SUSPEND_RESUME_TEST
|
||||||
|
typedef void (*hdd_fake_resume_callback)(uint32_t val);
|
||||||
|
void hif_fake_apps_suspend(hdd_fake_resume_callback callback);
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@@ -243,6 +243,61 @@ void ce_tasklet_kill(struct hif_softc *scn)
|
|||||||
qdf_atomic_set(&scn->active_tasklet_cnt, 0);
|
qdf_atomic_set(&scn->active_tasklet_cnt, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef WLAN_SUSPEND_RESUME_TEST
|
||||||
|
static bool g_hif_apps_fake_suspended;
|
||||||
|
static hdd_fake_resume_callback hdd_fake_aps_resume;
|
||||||
|
|
||||||
|
static void hif_wlan_resume_work_handler(struct work_struct *work)
|
||||||
|
{
|
||||||
|
hdd_fake_aps_resume(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static DECLARE_WORK(hif_resume_work, hif_wlan_resume_work_handler);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* hif_fake_apps_suspend(): Suspend WLAN
|
||||||
|
*
|
||||||
|
* Set the fake suspend flag such that hif knows that it will need
|
||||||
|
* to fake the aps resume process using the hdd_fake_aps_resume
|
||||||
|
*
|
||||||
|
* Return: none
|
||||||
|
*/
|
||||||
|
void hif_fake_apps_suspend(hdd_fake_resume_callback callback)
|
||||||
|
{
|
||||||
|
hdd_fake_aps_resume = callback;
|
||||||
|
g_hif_apps_fake_suspended = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* hif_fake_aps_resume(): check if WLAN resume is needed
|
||||||
|
*
|
||||||
|
* Return: true if a fake apps resume has been been triggered
|
||||||
|
* returns false if regular interrupt processing is needed
|
||||||
|
*/
|
||||||
|
static bool hif_fake_aps_resume(void)
|
||||||
|
{
|
||||||
|
if (g_hif_apps_fake_suspended) {
|
||||||
|
g_hif_apps_fake_suspended = false;
|
||||||
|
schedule_work(&hif_resume_work);
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
/**
|
||||||
|
* hif_fake_aps_resume(): check if WLAN resume is needed
|
||||||
|
*
|
||||||
|
* Return: always false if WLAN_SUSPEND_RESUME_TEST is not defined
|
||||||
|
*/
|
||||||
|
static bool hif_fake_aps_resume(void)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
#endif /* End of WLAN_SUSPEND_RESUME_TEST */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* hif_snoc_interrupt_handler() - hif_snoc_interrupt_handler
|
* hif_snoc_interrupt_handler() - hif_snoc_interrupt_handler
|
||||||
* @irq: irq coming from kernel
|
* @irq: irq coming from kernel
|
||||||
@@ -341,6 +396,13 @@ irqreturn_t ce_dispatch_interrupt(int ce_id,
|
|||||||
qdf_atomic_inc(&scn->active_tasklet_cnt);
|
qdf_atomic_inc(&scn->active_tasklet_cnt);
|
||||||
hif_record_ce_desc_event(scn, ce_id, HIF_IRQ_EVENT, NULL, NULL, 0);
|
hif_record_ce_desc_event(scn, ce_id, HIF_IRQ_EVENT, NULL, NULL, 0);
|
||||||
hif_ce_increment_interrupt_count(hif_ce_state, ce_id);
|
hif_ce_increment_interrupt_count(hif_ce_state, ce_id);
|
||||||
|
|
||||||
|
if (unlikely(hif_fake_aps_resume())) {
|
||||||
|
HIF_ERROR("received resume interrupt");
|
||||||
|
hif_irq_enable(scn, ce_id);
|
||||||
|
return IRQ_HANDLED;
|
||||||
|
}
|
||||||
|
|
||||||
if (hif_napi_enabled(hif_hdl, ce_id))
|
if (hif_napi_enabled(hif_hdl, ce_id))
|
||||||
hif_napi_schedule(hif_hdl, ce_id);
|
hif_napi_schedule(hif_hdl, ce_id);
|
||||||
else
|
else
|
||||||
|
Reference in New Issue
Block a user