qcacld-3.0: Use dynamic alloc for DSC driver context
The DSC driver context was originally statically allocated to allow its creation before QDF was initialized. However, other complications with the QDF debug infrastructure lead to QDF being initialized before DSC anyway. Static allocation has a number of drawbacks (esp. see singleton anit-pattern), which impacts our ability to do unit testing on a driver which actively leverages DSC. To support unit-testing DSC in a driver which also uses DSC, move the DSC driver context to dynamic, instead of static, allocation. Change-Id: Ic3121092c71d5c46e8521a775281ad2c45e3fe7d CRs-Fixed: 2320599
This commit is contained in:

committed by
Nitesh Shrivastav

parent
32ffab3d24
commit
5ecffb6ba7
@@ -23,6 +23,9 @@
|
||||
#include "__wlan_dsc.h"
|
||||
#include "wlan_dsc.h"
|
||||
|
||||
#define __dsc_driver_lock(vdev) __dsc_lock((vdev)->psoc->driver)
|
||||
#define __dsc_driver_unlock(vdev) __dsc_unlock((vdev)->psoc->driver)
|
||||
|
||||
static QDF_STATUS
|
||||
__dsc_vdev_create(struct dsc_psoc *psoc, struct dsc_vdev **out_vdev)
|
||||
{
|
||||
@@ -46,9 +49,9 @@ __dsc_vdev_create(struct dsc_psoc *psoc, struct dsc_vdev **out_vdev)
|
||||
__dsc_ops_init(&vdev->ops);
|
||||
|
||||
/* attach */
|
||||
__dsc_lock();
|
||||
__dsc_driver_lock(vdev);
|
||||
qdf_list_insert_back(&psoc->vdevs, &vdev->node);
|
||||
__dsc_unlock();
|
||||
__dsc_driver_unlock(vdev);
|
||||
|
||||
*out_vdev = vdev;
|
||||
|
||||
@@ -84,9 +87,9 @@ static void __dsc_vdev_destroy(struct dsc_vdev **out_vdev)
|
||||
;
|
||||
|
||||
/* detach */
|
||||
__dsc_lock();
|
||||
__dsc_driver_lock(vdev);
|
||||
qdf_list_remove_node(&vdev->psoc->vdevs, &vdev->node);
|
||||
__dsc_unlock();
|
||||
__dsc_driver_unlock(vdev);
|
||||
|
||||
/* de-init */
|
||||
__dsc_ops_deinit(&vdev->ops);
|
||||
@@ -137,9 +140,9 @@ __dsc_vdev_trans_start(struct dsc_vdev *vdev, const char *desc)
|
||||
if (!dsc_assert(desc))
|
||||
return QDF_STATUS_E_INVAL;
|
||||
|
||||
__dsc_lock();
|
||||
__dsc_driver_lock(vdev);
|
||||
status = __dsc_vdev_trans_start_nolock(vdev, desc);
|
||||
__dsc_unlock();
|
||||
__dsc_driver_unlock(vdev);
|
||||
|
||||
return status;
|
||||
}
|
||||
@@ -167,17 +170,17 @@ __dsc_vdev_trans_start_wait(struct dsc_vdev *vdev, const char *desc)
|
||||
if (!dsc_assert(desc))
|
||||
return QDF_STATUS_E_INVAL;
|
||||
|
||||
__dsc_lock();
|
||||
__dsc_driver_lock(vdev);
|
||||
|
||||
status = __dsc_vdev_trans_start_nolock(vdev, desc);
|
||||
if (QDF_IS_STATUS_SUCCESS(status)) {
|
||||
__dsc_unlock();
|
||||
__dsc_driver_unlock(vdev);
|
||||
return QDF_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
__dsc_trans_queue(&vdev->trans, &tran, desc);
|
||||
|
||||
__dsc_unlock();
|
||||
__dsc_driver_unlock(vdev);
|
||||
|
||||
return __dsc_tran_wait(&tran);
|
||||
}
|
||||
@@ -218,18 +221,18 @@ static void __dsc_vdev_trans_stop(struct dsc_vdev *vdev)
|
||||
void dsc_vdev_trans_stop(struct dsc_vdev *vdev)
|
||||
{
|
||||
dsc_enter();
|
||||
__dsc_lock();
|
||||
__dsc_driver_lock(vdev);
|
||||
__dsc_vdev_trans_stop(vdev);
|
||||
__dsc_unlock();
|
||||
__dsc_driver_unlock(vdev);
|
||||
dsc_exit();
|
||||
}
|
||||
|
||||
void dsc_vdev_trans_assert(struct dsc_vdev *vdev)
|
||||
{
|
||||
dsc_enter();
|
||||
__dsc_lock();
|
||||
__dsc_driver_lock(vdev);
|
||||
dsc_assert(vdev->trans.active_desc);
|
||||
__dsc_unlock();
|
||||
__dsc_driver_unlock(vdev);
|
||||
dsc_exit();
|
||||
}
|
||||
|
||||
@@ -252,9 +255,9 @@ QDF_STATUS _dsc_vdev_op_start(struct dsc_vdev *vdev, const char *func)
|
||||
QDF_STATUS status;
|
||||
|
||||
dsc_enter_str(func);
|
||||
__dsc_lock();
|
||||
__dsc_driver_lock(vdev);
|
||||
status = __dsc_vdev_op_start(vdev, func);
|
||||
__dsc_unlock();
|
||||
__dsc_driver_unlock(vdev);
|
||||
dsc_exit_status(status);
|
||||
|
||||
return status;
|
||||
@@ -275,9 +278,9 @@ static void __dsc_vdev_op_stop(struct dsc_vdev *vdev, const char *func)
|
||||
void _dsc_vdev_op_stop(struct dsc_vdev *vdev, const char *func)
|
||||
{
|
||||
dsc_enter_str(func);
|
||||
__dsc_lock();
|
||||
__dsc_driver_lock(vdev);
|
||||
__dsc_vdev_op_stop(vdev, func);
|
||||
__dsc_unlock();
|
||||
__dsc_driver_unlock(vdev);
|
||||
dsc_exit();
|
||||
}
|
||||
|
||||
@@ -288,7 +291,7 @@ static void __dsc_vdev_wait_for_ops(struct dsc_vdev *vdev)
|
||||
if (!dsc_assert(vdev))
|
||||
return;
|
||||
|
||||
__dsc_lock();
|
||||
__dsc_driver_lock(vdev);
|
||||
|
||||
/* flushing without preventing new ops is almost certainly a bug */
|
||||
dsc_assert(!__dsc_vdev_can_op(vdev));
|
||||
@@ -297,7 +300,7 @@ static void __dsc_vdev_wait_for_ops(struct dsc_vdev *vdev)
|
||||
if (wait)
|
||||
qdf_event_reset(&vdev->ops.event);
|
||||
|
||||
__dsc_unlock();
|
||||
__dsc_driver_unlock(vdev);
|
||||
|
||||
if (wait)
|
||||
qdf_wait_single_event(&vdev->ops.event, 0);
|
||||
|
Reference in New Issue
Block a user