qcacld-3.0: Add pmo_psoc_with_ctx() macro

It is really common to want to update or read from the PMO private
context, but doing so requires several lines boilerplate code. Because
this boilerplate is in so many places, mistakes like using the wrong
lock operation, or forgetting to use locks at all, are a always a
danger. Add pmo_psoc_with_ctx() to address this deficiency, which
retrieves the private context pointer, locks on entry, and unlocks on
exit. Usage is like so:

	struct pmo_psoc_prov_obj *psoc_ctx;

	pmo_psoc_with_ctx(psoc, psoc_ctx) {
		/* use psoc_ctx */
	}

Which is equivalent to:

	struct pmo_psoc_prov_obj *psoc_ctx;

	psoc_ctx = pmo_psoc_get_priv(psoc);
	qdf_spin_lock_bh(&psoc_ctx->lock);
	/* use psoc_ctx */
	qdf_spin_unlock_bh(&psoc_ctx->lock);

Change-Id: I6a3ccbfbfb57c589d44c7eae57e2ed8272dae3ee
CRs-Fixed: 2197722
这个提交包含在:
Dustin Brown
2018-02-28 12:49:28 -08:00
提交者 snandini
父节点 ad48da603d
当前提交 fbe4e7d67b
修改 6 个文件,包含 101 行新增109 行删除

查看文件

@@ -596,10 +596,11 @@ QDF_STATUS pmo_register_pause_bitmap_notifier(struct wlan_objmgr_psoc *psoc,
pmo_err("pmo cannot get the reference out of psoc");
return status;
}
psoc_ctx = pmo_psoc_get_priv(psoc);
qdf_spin_lock_bh(&psoc_ctx->lock);
psoc_ctx->pause_bitmap_notifier = handler;
qdf_spin_unlock_bh(&psoc_ctx->lock);
pmo_psoc_with_ctx(psoc, psoc_ctx) {
psoc_ctx->pause_bitmap_notifier = handler;
}
pmo_psoc_put_ref(psoc);
return QDF_STATUS_SUCCESS;
@@ -626,11 +627,12 @@ QDF_STATUS pmo_unregister_pause_bitmap_notifier(struct wlan_objmgr_psoc *psoc,
pmo_err("pmo cannot get the reference out of psoc");
return status;
}
psoc_ctx = pmo_psoc_get_priv(psoc);
qdf_spin_lock_bh(&psoc_ctx->lock);
if (psoc_ctx->pause_bitmap_notifier == handler)
psoc_ctx->pause_bitmap_notifier = NULL;
qdf_spin_unlock_bh(&psoc_ctx->lock);
pmo_psoc_with_ctx(psoc, psoc_ctx) {
if (psoc_ctx->pause_bitmap_notifier == handler)
psoc_ctx->pause_bitmap_notifier = NULL;
}
pmo_psoc_put_ref(psoc);
return QDF_STATUS_SUCCESS;
@@ -657,10 +659,11 @@ QDF_STATUS pmo_register_get_pause_bitmap(struct wlan_objmgr_psoc *psoc,
pmo_err("pmo cannot get the reference out of psoc");
return status;
}
psoc_ctx = pmo_psoc_get_priv(psoc);
qdf_spin_lock_bh(&psoc_ctx->lock);
psoc_ctx->get_pause_bitmap = handler;
qdf_spin_unlock_bh(&psoc_ctx->lock);
pmo_psoc_with_ctx(psoc, psoc_ctx) {
psoc_ctx->get_pause_bitmap = handler;
}
pmo_psoc_put_ref(psoc);
return QDF_STATUS_SUCCESS;
@@ -687,11 +690,12 @@ QDF_STATUS pmo_unregister_get_pause_bitmap(struct wlan_objmgr_psoc *psoc,
pmo_err("pmo cannot get the reference out of psoc");
return status;
}
psoc_ctx = pmo_psoc_get_priv(psoc);
qdf_spin_lock_bh(&psoc_ctx->lock);
if (psoc_ctx->get_pause_bitmap == handler)
psoc_ctx->get_pause_bitmap = NULL;
qdf_spin_unlock_bh(&psoc_ctx->lock);
pmo_psoc_with_ctx(psoc, psoc_ctx) {
if (psoc_ctx->get_pause_bitmap == handler)
psoc_ctx->get_pause_bitmap = NULL;
}
pmo_psoc_put_ref(psoc);
return QDF_STATUS_SUCCESS;
@@ -718,10 +722,11 @@ QDF_STATUS pmo_register_is_device_in_low_pwr_mode(struct wlan_objmgr_psoc *psoc,
pmo_err("pmo cannot get the reference out of psoc");
return status;
}
psoc_ctx = pmo_psoc_get_priv(psoc);
qdf_spin_lock_bh(&psoc_ctx->lock);
psoc_ctx->is_device_in_low_pwr_mode = handler;
qdf_spin_unlock_bh(&psoc_ctx->lock);
pmo_psoc_with_ctx(psoc, psoc_ctx) {
psoc_ctx->is_device_in_low_pwr_mode = handler;
}
pmo_psoc_put_ref(psoc);
return QDF_STATUS_SUCCESS;
@@ -749,10 +754,11 @@ QDF_STATUS pmo_unregister_is_device_in_low_pwr_mode(
pmo_err("pmo cannot get the reference out of psoc");
return status;
}
psoc_ctx = pmo_psoc_get_priv(psoc);
qdf_spin_lock_bh(&psoc_ctx->lock);
psoc_ctx->is_device_in_low_pwr_mode = NULL;
qdf_spin_unlock_bh(&psoc_ctx->lock);
pmo_psoc_with_ctx(psoc, psoc_ctx) {
psoc_ctx->is_device_in_low_pwr_mode = NULL;
}
pmo_psoc_put_ref(psoc);
return QDF_STATUS_SUCCESS;