mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-11 15:11:48 -04:00
qcacmn: Pause CDP timer during bus/runtime suspend
Converged datapath currently uses a polling timer to check for pending
traffic. As part of suspend, pause the polling timer to avoid any
invalid accesses.
Change-Id: I6b4654c6737c08475443d021c04ba9385d084d74
CRs-Fixed: 2047505
This commit is contained in:
parent
2e55c111a8
commit
4a3b96b4f1
3 changed files with 49 additions and 34 deletions
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (c) 2016 The Linux Foundation. All rights reserved.
|
||||
* Copyright (c) 2016-2017 The Linux Foundation. All rights reserved.
|
||||
*
|
||||
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
|
||||
*
|
||||
|
|
@ -34,12 +34,14 @@
|
|||
/**
|
||||
* cdp_bus_suspend() - suspend bus
|
||||
* @soc - data path soc handle
|
||||
* @ppdev: data path pdev handle
|
||||
*
|
||||
* suspend bus
|
||||
*
|
||||
* return QDF_STATUS_SUCCESS suspend is not implemented or suspend done
|
||||
*/
|
||||
static inline QDF_STATUS cdp_bus_suspend(ol_txrx_soc_handle soc)
|
||||
static inline QDF_STATUS cdp_bus_suspend(ol_txrx_soc_handle soc,
|
||||
struct cdp_pdev *ppdev)
|
||||
{
|
||||
if (!soc || !soc->ops || !soc->ops->bus_ops) {
|
||||
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
|
||||
|
|
@ -48,19 +50,21 @@ static inline QDF_STATUS cdp_bus_suspend(ol_txrx_soc_handle soc)
|
|||
}
|
||||
|
||||
if (soc->ops->bus_ops->bus_suspend)
|
||||
return soc->ops->bus_ops->bus_suspend();
|
||||
return soc->ops->bus_ops->bus_suspend(ppdev);
|
||||
return QDF_STATUS_E_NOSUPPORT;
|
||||
}
|
||||
|
||||
/**
|
||||
* cdp_bus_resume() - resume bus
|
||||
* @soc - data path soc handle
|
||||
* @ppdev: data path pdev handle
|
||||
*
|
||||
* resume bus
|
||||
*
|
||||
* return QDF_STATUS_SUCCESS resume is not implemented or suspend done
|
||||
*/
|
||||
static inline QDF_STATUS cdp_bus_resume(ol_txrx_soc_handle soc)
|
||||
static inline QDF_STATUS cdp_bus_resume(ol_txrx_soc_handle soc,
|
||||
struct cdp_pdev *ppdev)
|
||||
{
|
||||
if (!soc || !soc->ops || !soc->ops->bus_ops) {
|
||||
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
|
||||
|
|
@ -69,7 +73,7 @@ static inline QDF_STATUS cdp_bus_resume(ol_txrx_soc_handle soc)
|
|||
}
|
||||
|
||||
if (soc->ops->bus_ops->bus_resume)
|
||||
return soc->ops->bus_ops->bus_resume();
|
||||
return soc->ops->bus_ops->bus_resume(ppdev);
|
||||
return QDF_STATUS_E_NOSUPPORT;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -790,8 +790,8 @@ struct cdp_ipa_ops {
|
|||
* @bus_resume:
|
||||
*/
|
||||
struct cdp_bus_ops {
|
||||
QDF_STATUS (*bus_suspend)(void);
|
||||
QDF_STATUS (*bus_resume)(void);
|
||||
QDF_STATUS (*bus_suspend)(struct cdp_pdev *opaque_pdev);
|
||||
QDF_STATUS (*bus_resume)(struct cdp_pdev *opaque_pdev);
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -3833,9 +3833,45 @@ static struct cdp_pflow_ops dp_ops_pflow = {
|
|||
};
|
||||
#endif /* CONFIG_WIN */
|
||||
|
||||
#ifdef DP_INTR_POLL_BASED
|
||||
static QDF_STATUS dp_bus_suspend(struct cdp_pdev *opaque_pdev)
|
||||
{
|
||||
struct dp_pdev *pdev = (struct dp_pdev *)opaque_pdev;
|
||||
struct dp_soc *soc = pdev->soc;
|
||||
|
||||
qdf_timer_stop(&soc->int_timer);
|
||||
|
||||
return QDF_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
static QDF_STATUS dp_bus_resume(struct cdp_pdev *opaque_pdev)
|
||||
{
|
||||
struct dp_pdev *pdev = (struct dp_pdev *)opaque_pdev;
|
||||
struct dp_soc *soc = pdev->soc;
|
||||
|
||||
qdf_timer_mod(&soc->int_timer, DP_INTR_POLL_TIMER_MS);
|
||||
|
||||
return QDF_STATUS_SUCCESS;
|
||||
}
|
||||
#else
|
||||
static QDF_STATUS dp_bus_suspend(struct cdp_pdev *opaque_pdev)
|
||||
{
|
||||
return QDF_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
static QDF_STATUS dp_bus_resume(struct cdp_pdev *opaque_pdev)
|
||||
{
|
||||
return QDF_STATUS_SUCCESS;
|
||||
}
|
||||
#endif /* DP_INTR_POLL_BASED */
|
||||
|
||||
#ifndef CONFIG_WIN
|
||||
static struct cdp_misc_ops dp_ops_misc = {
|
||||
.get_opmode = dp_get_opmode,
|
||||
#ifdef FEATURE_RUNTIME_PM
|
||||
.runtime_suspend = dp_bus_suspend,
|
||||
.runtime_resume = dp_bus_resume,
|
||||
#endif
|
||||
};
|
||||
|
||||
static struct cdp_flowctl_ops dp_ops_flowctl = {
|
||||
|
|
@ -3850,34 +3886,9 @@ static struct cdp_ipa_ops dp_ops_ipa = {
|
|||
/* WIFI 3.0 DP NOT IMPLEMENTED YET */
|
||||
};
|
||||
|
||||
/**
|
||||
* dp_dummy_bus_suspend() - dummy bus suspend op
|
||||
*
|
||||
* FIXME - This is a placeholder for the actual logic!
|
||||
*
|
||||
* Return: QDF_STATUS_SUCCESS
|
||||
*/
|
||||
inline QDF_STATUS dp_dummy_bus_suspend(void)
|
||||
{
|
||||
return QDF_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* dp_dummy_bus_resume() - dummy bus resume
|
||||
*
|
||||
* FIXME - This is a placeholder for the actual logic!
|
||||
*
|
||||
* Return: QDF_STATUS_SUCCESS
|
||||
*/
|
||||
inline QDF_STATUS dp_dummy_bus_resume(void)
|
||||
{
|
||||
return QDF_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
static struct cdp_bus_ops dp_ops_bus = {
|
||||
/* WIFI 3.0 DP NOT IMPLEMENTED YET */
|
||||
.bus_suspend = dp_dummy_bus_suspend,
|
||||
.bus_resume = dp_dummy_bus_resume
|
||||
.bus_suspend = dp_bus_suspend,
|
||||
.bus_resume = dp_bus_resume
|
||||
};
|
||||
|
||||
static struct cdp_ocb_ops dp_ops_ocb = {
|
||||
|
|
|
|||
Loading…
Reference in a new issue