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:
Dustin Brown 2017-05-10 15:49:38 -07:00 • committed by snandini
commit 4a3b96b4f1
3 changed files with 49 additions and 34 deletions

View file

@ -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;
}

View file

@ -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);
};
/**

View file

@ -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 = {