qcacld-3.0: Use wma callback to get vdev dp handle
PMO should not know about vdev data path handle, but pmo_unpause_all_vdev() need it, so register a wma callback to retrieve the vdev dp handle instead of keep a copy in pmo vdev private context. Refine current code to retrieve vdev dp handle using a wma callback Change-Id: I1f668fff633a5e5cdfc478e7f619e9600930b333 CRs-Fixed: 2227384
This commit is contained in:
@@ -214,41 +214,26 @@ static inline void *pmo_core_psoc_get_dp_handle(struct wlan_objmgr_psoc *psoc)
|
|||||||
return dp_hdl;
|
return dp_hdl;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* pmo_core_vdev_update_dp_handle() - update vdev data path handle
|
|
||||||
* @vdev: objmgr vdev handle
|
|
||||||
* @dp_hdl: Vdev data path handle
|
|
||||||
*
|
|
||||||
* Return: None
|
|
||||||
*/
|
|
||||||
static inline
|
|
||||||
void pmo_core_vdev_update_dp_handle(struct wlan_objmgr_vdev *vdev,
|
|
||||||
void *dp_hdl)
|
|
||||||
{
|
|
||||||
struct pmo_vdev_priv_obj *vdev_ctx;
|
|
||||||
|
|
||||||
vdev_ctx = pmo_vdev_get_priv(vdev);
|
|
||||||
qdf_spin_lock_bh(&vdev_ctx->pmo_vdev_lock);
|
|
||||||
vdev_ctx->vdev_dp_hdl = dp_hdl;
|
|
||||||
qdf_spin_unlock_bh(&vdev_ctx->pmo_vdev_lock);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* pmo_core_vdev_get_dp_handle() - Get vdev data path handle
|
* pmo_core_vdev_get_dp_handle() - Get vdev data path handle
|
||||||
* @vdev: objmgr vdev handle
|
* @psoc_ctx: pmo psoc private context
|
||||||
|
* @vdev_id: vdev id config to get data path handle
|
||||||
*
|
*
|
||||||
* Return: Vdev data path handle
|
* Return: Vdev data path handle
|
||||||
*/
|
*/
|
||||||
static inline
|
static inline
|
||||||
void *pmo_core_vdev_get_dp_handle(struct wlan_objmgr_vdev *vdev)
|
struct cdp_vdev *pmo_core_vdev_get_dp_handle(struct pmo_psoc_priv_obj *psoc_ctx,
|
||||||
|
uint8_t vdev_id)
|
||||||
{
|
{
|
||||||
void *dp_hdl;
|
struct cdp_vdev *dp_hdl = NULL;
|
||||||
struct pmo_vdev_priv_obj *vdev_ctx;
|
pmo_get_vdev_dp_handle handler;
|
||||||
|
|
||||||
vdev_ctx = pmo_vdev_get_priv(vdev);
|
qdf_spin_lock_bh(&psoc_ctx->lock);
|
||||||
qdf_spin_lock_bh(&vdev_ctx->pmo_vdev_lock);
|
handler = psoc_ctx->get_vdev_dp_handle;
|
||||||
dp_hdl = vdev_ctx->vdev_dp_hdl;
|
qdf_spin_unlock_bh(&psoc_ctx->lock);
|
||||||
qdf_spin_unlock_bh(&vdev_ctx->pmo_vdev_lock);
|
|
||||||
|
if (handler)
|
||||||
|
dp_hdl = handler(vdev_id);
|
||||||
|
|
||||||
return dp_hdl;
|
return dp_hdl;
|
||||||
}
|
}
|
||||||
|
@@ -62,6 +62,7 @@ struct pmo_psoc_priv_obj {
|
|||||||
void *txrx_hdl;
|
void *txrx_hdl;
|
||||||
pmo_notify_pause_bitmap pause_bitmap_notifier;
|
pmo_notify_pause_bitmap pause_bitmap_notifier;
|
||||||
pmo_get_pause_bitmap get_pause_bitmap;
|
pmo_get_pause_bitmap get_pause_bitmap;
|
||||||
|
pmo_get_vdev_dp_handle get_vdev_dp_handle;
|
||||||
pmo_is_device_in_low_pwr_mode is_device_in_low_pwr_mode;
|
pmo_is_device_in_low_pwr_mode is_device_in_low_pwr_mode;
|
||||||
pmo_get_cfg_int get_cfg_int;
|
pmo_get_cfg_int get_cfg_int;
|
||||||
pmo_get_dtim_period get_dtim_period;
|
pmo_get_dtim_period get_dtim_period;
|
||||||
@@ -110,7 +111,6 @@ struct wlan_pmo_ctx {
|
|||||||
* @beacon_interval: vdev beacon interval
|
* @beacon_interval: vdev beacon interval
|
||||||
* @alt_modulated_dtim_enabled:dynamic modulated dtim enabled
|
* @alt_modulated_dtim_enabled:dynamic modulated dtim enabled
|
||||||
* @dtim_policy: tells vdev beacon dtim policy
|
* @dtim_policy: tells vdev beacon dtim policy
|
||||||
* @vdev_dp_hdl: vdev data path handle
|
|
||||||
* @pmo_vdev_lock: spin lock for pmo vdev priv ctx
|
* @pmo_vdev_lock: spin lock for pmo vdev priv ctx
|
||||||
*/
|
*/
|
||||||
struct pmo_vdev_priv_obj {
|
struct pmo_vdev_priv_obj {
|
||||||
@@ -133,7 +133,6 @@ struct pmo_vdev_priv_obj {
|
|||||||
uint8_t beacon_interval;
|
uint8_t beacon_interval;
|
||||||
bool alt_modulated_dtim_enable;
|
bool alt_modulated_dtim_enable;
|
||||||
uint32_t dtim_policy;
|
uint32_t dtim_policy;
|
||||||
void *vdev_dp_hdl;
|
|
||||||
qdf_spinlock_t pmo_vdev_lock;
|
qdf_spinlock_t pmo_vdev_lock;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -520,18 +520,18 @@ static void pmo_unpause_all_vdev(struct wlan_objmgr_psoc *psoc,
|
|||||||
struct pmo_psoc_priv_obj *psoc_ctx)
|
struct pmo_psoc_priv_obj *psoc_ctx)
|
||||||
{
|
{
|
||||||
uint8_t vdev_id;
|
uint8_t vdev_id;
|
||||||
struct wlan_objmgr_vdev *vdev;
|
struct cdp_vdev *vdev_dp;
|
||||||
|
|
||||||
/* Iterate through VDEV list */
|
/* Iterate through VDEV list */
|
||||||
for (vdev_id = 0; vdev_id < WLAN_UMAC_PSOC_MAX_VDEVS; vdev_id++) {
|
for (vdev_id = 0; vdev_id < WLAN_UMAC_PSOC_MAX_VDEVS; vdev_id++) {
|
||||||
vdev = pmo_psoc_get_vdev(psoc, vdev_id);
|
vdev_dp = pmo_core_vdev_get_dp_handle(psoc_ctx, vdev_id);
|
||||||
if (!vdev)
|
if (!vdev_dp)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
/* When host resumes, by default unpause all active vdev */
|
/* When host resumes, by default unpause all active vdev */
|
||||||
if (pmo_core_vdev_get_pause_bitmap(psoc_ctx, vdev_id)) {
|
if (pmo_core_vdev_get_pause_bitmap(psoc_ctx, vdev_id)) {
|
||||||
cdp_fc_vdev_unpause(pmo_core_psoc_get_dp_handle(psoc),
|
cdp_fc_vdev_unpause(pmo_core_psoc_get_dp_handle(psoc),
|
||||||
pmo_core_vdev_get_dp_handle(vdev),
|
vdev_dp,
|
||||||
0xffffffff);
|
0xffffffff);
|
||||||
if (psoc_ctx->pause_bitmap_notifier)
|
if (psoc_ctx->pause_bitmap_notifier)
|
||||||
psoc_ctx->pause_bitmap_notifier(vdev_id, 0);
|
psoc_ctx->pause_bitmap_notifier(vdev_id, 0);
|
||||||
|
@@ -250,6 +250,24 @@ pmo_register_get_beacon_interval_callback(struct wlan_objmgr_psoc *psoc,
|
|||||||
QDF_STATUS
|
QDF_STATUS
|
||||||
pmo_unregister_get_beacon_interval_callback(struct wlan_objmgr_psoc *psoc);
|
pmo_unregister_get_beacon_interval_callback(struct wlan_objmgr_psoc *psoc);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* pmo_register_get_vdev_dp_handle(): API to register get vdev datapath handle
|
||||||
|
* @psoc: objmgr psoc handle
|
||||||
|
* @handler: get vdev datapath handle callback
|
||||||
|
*
|
||||||
|
* Return QDF_STATUS status - in case of success else return error
|
||||||
|
*/
|
||||||
|
QDF_STATUS pmo_register_get_vdev_dp_handle(struct wlan_objmgr_psoc *psoc,
|
||||||
|
pmo_get_vdev_dp_handle handler);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* pmo_unregister_get_vdev_dp_handle(): API to unregister get vdev dp handle
|
||||||
|
* @psoc: objmgr psoc handle
|
||||||
|
*
|
||||||
|
* Return QDF_STATUS status - in case of success else return error
|
||||||
|
*/
|
||||||
|
QDF_STATUS pmo_unregister_get_vdev_dp_handle(struct wlan_objmgr_psoc *psoc);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* pmo_register_is_device_in_low_pwr_mode(): API to get register device power
|
* pmo_register_is_device_in_low_pwr_mode(): API to get register device power
|
||||||
* save check notifier.
|
* save check notifier.
|
||||||
@@ -403,6 +421,19 @@ pmo_unregister_get_pause_bitmap(struct wlan_objmgr_psoc *psoc)
|
|||||||
return QDF_STATUS_SUCCESS;
|
return QDF_STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline QDF_STATUS
|
||||||
|
pmo_register_get_vdev_dp_handle(struct wlan_objmgr_psoc *psoc,
|
||||||
|
pmo_get_vdev_dp_handle handler)
|
||||||
|
{
|
||||||
|
return QDF_STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline QDF_STATUS
|
||||||
|
QDF_STATUS pmo_unregister_get_vdev_dp_handle(struct wlan_objmgr_psoc *psoc)
|
||||||
|
{
|
||||||
|
return QDF_STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
static inline QDF_STATUS
|
static inline QDF_STATUS
|
||||||
pmo_register_is_device_in_low_pwr_mode(struct wlan_objmgr_psoc *psoc,
|
pmo_register_is_device_in_low_pwr_mode(struct wlan_objmgr_psoc *psoc,
|
||||||
pmo_is_device_in_low_pwr_mode handler)
|
pmo_is_device_in_low_pwr_mode handler)
|
||||||
|
@@ -60,6 +60,11 @@ typedef QDF_STATUS (*pmo_get_beacon_interval)(uint8_t vdev_id, uint16_t *value);
|
|||||||
*/
|
*/
|
||||||
typedef uint16_t(*pmo_get_pause_bitmap)(uint8_t vdev_id);
|
typedef uint16_t(*pmo_get_pause_bitmap)(uint8_t vdev_id);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* typedef for getting vdev datapath handle
|
||||||
|
*/
|
||||||
|
typedef struct cdp_vdev * (*pmo_get_vdev_dp_handle)(uint8_t vdev_id);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* typedef to know is deviec is in power save mode
|
* typedef to know is deviec is in power save mode
|
||||||
*/
|
*/
|
||||||
|
@@ -455,16 +455,6 @@ void pmo_ucfg_psoc_update_power_save_mode(struct wlan_objmgr_psoc *psoc,
|
|||||||
void pmo_ucfg_psoc_update_dp_handle(struct wlan_objmgr_psoc *psoc,
|
void pmo_ucfg_psoc_update_dp_handle(struct wlan_objmgr_psoc *psoc,
|
||||||
void *dp_hdl);
|
void *dp_hdl);
|
||||||
|
|
||||||
/**
|
|
||||||
* pmo_ucfg_vdev_update_dp_handle() - update vdev data path handle
|
|
||||||
* @vdev: objmgr vdev handle
|
|
||||||
* @dp_hdl: vdev data path handle
|
|
||||||
*
|
|
||||||
* Return: None
|
|
||||||
*/
|
|
||||||
void pmo_ucfg_vdev_update_dp_handle(struct wlan_objmgr_vdev *vdev,
|
|
||||||
void *dp_hdl);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* pmo_ucfg_psoc_update_htc_handle() - update psoc htc layer handle
|
* pmo_ucfg_psoc_update_htc_handle() - update psoc htc layer handle
|
||||||
* @psoc: objmgr psoc handle
|
* @psoc: objmgr psoc handle
|
||||||
|
@@ -744,6 +744,47 @@ pmo_unregister_is_device_in_low_pwr_mode(struct wlan_objmgr_psoc *psoc)
|
|||||||
return QDF_STATUS_SUCCESS;
|
return QDF_STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QDF_STATUS pmo_register_get_vdev_dp_handle(struct wlan_objmgr_psoc *psoc,
|
||||||
|
pmo_get_vdev_dp_handle handler)
|
||||||
|
{
|
||||||
|
struct pmo_psoc_priv_obj *psoc_ctx;
|
||||||
|
|
||||||
|
if (!psoc) {
|
||||||
|
QDF_BUG(psoc);
|
||||||
|
pmo_err("psoc is null");
|
||||||
|
return QDF_STATUS_E_NULL_VALUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!handler) {
|
||||||
|
QDF_BUG(handler);
|
||||||
|
pmo_err("pmo_get_vdev_dp_handle is null");
|
||||||
|
return QDF_STATUS_E_NULL_VALUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
pmo_psoc_with_ctx(psoc, psoc_ctx) {
|
||||||
|
psoc_ctx->get_vdev_dp_handle = handler;
|
||||||
|
}
|
||||||
|
|
||||||
|
return QDF_STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
QDF_STATUS pmo_unregister_get_vdev_dp_handle(struct wlan_objmgr_psoc *psoc)
|
||||||
|
{
|
||||||
|
struct pmo_psoc_priv_obj *psoc_ctx;
|
||||||
|
|
||||||
|
if (!psoc) {
|
||||||
|
QDF_BUG(psoc);
|
||||||
|
pmo_err("psoc is null");
|
||||||
|
return QDF_STATUS_E_NULL_VALUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
pmo_psoc_with_ctx(psoc, psoc_ctx) {
|
||||||
|
psoc_ctx->get_vdev_dp_handle = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return QDF_STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
QDF_STATUS pmo_register_get_cfg_int_callback(struct wlan_objmgr_psoc *psoc,
|
QDF_STATUS pmo_register_get_cfg_int_callback(struct wlan_objmgr_psoc *psoc,
|
||||||
pmo_get_cfg_int handler)
|
pmo_get_cfg_int handler)
|
||||||
{
|
{
|
||||||
|
@@ -273,12 +273,6 @@ void pmo_ucfg_psoc_update_dp_handle(struct wlan_objmgr_psoc *psoc,
|
|||||||
pmo_core_psoc_update_dp_handle(psoc, dp_handle);
|
pmo_core_psoc_update_dp_handle(psoc, dp_handle);
|
||||||
}
|
}
|
||||||
|
|
||||||
void pmo_ucfg_vdev_update_dp_handle(struct wlan_objmgr_vdev *vdev,
|
|
||||||
void *dp_handle)
|
|
||||||
{
|
|
||||||
pmo_core_vdev_update_dp_handle(vdev, dp_handle);
|
|
||||||
}
|
|
||||||
|
|
||||||
void pmo_ucfg_psoc_update_htc_handle(struct wlan_objmgr_psoc *psoc,
|
void pmo_ucfg_psoc_update_htc_handle(struct wlan_objmgr_psoc *psoc,
|
||||||
void *htc_handle)
|
void *htc_handle)
|
||||||
{
|
{
|
||||||
|
@@ -2351,6 +2351,37 @@ uint16_t wma_vdev_get_pause_bitmap(uint8_t vdev_id)
|
|||||||
return iface->pause_bitmap;
|
return iface->pause_bitmap;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* wma_vdev_get_dp_handle() - Get vdev datapth handle
|
||||||
|
* @vdev_id: the Id of the vdev to configure
|
||||||
|
*
|
||||||
|
* Return: Vdev datapath handle else NULL on error
|
||||||
|
*/
|
||||||
|
static inline
|
||||||
|
struct cdp_vdev *wma_vdev_get_vdev_dp_handle(uint8_t vdev_id)
|
||||||
|
{
|
||||||
|
tp_wma_handle wma = (tp_wma_handle)cds_get_context(QDF_MODULE_ID_WMA);
|
||||||
|
struct wma_txrx_node *iface;
|
||||||
|
|
||||||
|
if (!wma) {
|
||||||
|
WMA_LOGE("%s: WMA context is invald!", __func__);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (vdev_id >= wma->max_bssid)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
iface = &wma->interfaces[vdev_id];
|
||||||
|
|
||||||
|
if (!iface) {
|
||||||
|
WMA_LOGE("%s: Failed to get iface: NULL",
|
||||||
|
__func__);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return iface->handle;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* wma_vdev_is_device_in_low_pwr_mode - is device in power save mode
|
* wma_vdev_is_device_in_low_pwr_mode - is device in power save mode
|
||||||
* @vdev_id: the Id of the vdev to configure
|
* @vdev_id: the Id of the vdev to configure
|
||||||
|
@@ -3532,6 +3532,8 @@ QDF_STATUS wma_open(struct wlan_objmgr_psoc *psoc,
|
|||||||
wma_vdev_update_pause_bitmap);
|
wma_vdev_update_pause_bitmap);
|
||||||
pmo_register_get_pause_bitmap(wma_handle->psoc,
|
pmo_register_get_pause_bitmap(wma_handle->psoc,
|
||||||
wma_vdev_get_pause_bitmap);
|
wma_vdev_get_pause_bitmap);
|
||||||
|
pmo_register_get_vdev_dp_handle(wma_handle->psoc,
|
||||||
|
wma_vdev_get_vdev_dp_handle);
|
||||||
pmo_register_is_device_in_low_pwr_mode(wma_handle->psoc,
|
pmo_register_is_device_in_low_pwr_mode(wma_handle->psoc,
|
||||||
wma_vdev_is_device_in_low_pwr_mode);
|
wma_vdev_is_device_in_low_pwr_mode);
|
||||||
pmo_register_get_cfg_int_callback(wma_handle->psoc,
|
pmo_register_get_cfg_int_callback(wma_handle->psoc,
|
||||||
@@ -4723,6 +4725,7 @@ QDF_STATUS wma_close(void)
|
|||||||
pmo_unregister_is_device_in_low_pwr_mode(wma_handle->psoc);
|
pmo_unregister_is_device_in_low_pwr_mode(wma_handle->psoc);
|
||||||
pmo_unregister_get_pause_bitmap(wma_handle->psoc);
|
pmo_unregister_get_pause_bitmap(wma_handle->psoc);
|
||||||
pmo_unregister_pause_bitmap_notifier(wma_handle->psoc);
|
pmo_unregister_pause_bitmap_notifier(wma_handle->psoc);
|
||||||
|
pmo_unregister_get_vdev_dp_handle(wma_handle->psoc);
|
||||||
|
|
||||||
target_if_free_psoc_tgt_info(wma_handle->psoc);
|
target_if_free_psoc_tgt_info(wma_handle->psoc);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user