qcacld-3.0: Schedule work for peer_unmap_timer_handler actions
Mutex cannot be used when peer_unmap_timer_handler() calls cds_trigger_recover() because it runs in soft_irq. Schedule work to perform the recovery instead. CRs-Fixed: 2060775 Change-Id: I9a9554ef0aa9288bf5abe22cd2513d8cc41c29d4
This commit is contained in:

committed by
snandini

parent
5f0ae149d9
commit
64bfe97415
@@ -3333,8 +3333,26 @@ static QDF_STATUS ol_txrx_clear_peer(struct cdp_pdev *ppdev, uint8_t sta_id)
|
||||
|
||||
}
|
||||
|
||||
void peer_unmap_timer_work_function(void *param)
|
||||
{
|
||||
WMA_LOGE("Enter: %s", __func__);
|
||||
/*
|
||||
* wma_peer_debug_dump() will be replaced with a new routine.
|
||||
* Add the equivalent of wma_peer_debug_dump() when available.
|
||||
*/
|
||||
if (cds_is_self_recovery_enabled()) {
|
||||
if (!cds_is_driver_recovering())
|
||||
cds_trigger_recovery(false);
|
||||
else
|
||||
WMA_LOGE("%s: Recovery is in progress, ignore!",
|
||||
__func__);
|
||||
} else {
|
||||
QDF_BUG(0);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* peer_unmap_timer() - peer unmap timer function
|
||||
* peer_unmap_timer_handler() - peer unmap timer function
|
||||
* @data: peer object pointer
|
||||
*
|
||||
* Return: none
|
||||
@@ -3342,6 +3360,7 @@ static QDF_STATUS ol_txrx_clear_peer(struct cdp_pdev *ppdev, uint8_t sta_id)
|
||||
void peer_unmap_timer_handler(void *data)
|
||||
{
|
||||
ol_txrx_peer_handle peer = (ol_txrx_peer_handle)data;
|
||||
ol_txrx_pdev_handle txrx_pdev = cds_get_context(QDF_MODULE_ID_TXRX);
|
||||
|
||||
ol_txrx_err("all unmap events not received for peer %p, ref_cnt %d",
|
||||
peer, qdf_atomic_read(&peer->ref_cnt));
|
||||
@@ -3351,10 +3370,10 @@ void peer_unmap_timer_handler(void *data)
|
||||
peer->mac_addr.raw[2], peer->mac_addr.raw[3],
|
||||
peer->mac_addr.raw[4], peer->mac_addr.raw[5]);
|
||||
if (!cds_is_driver_recovering()) {
|
||||
/*
|
||||
* Add the equivalent of wma_peer_debug_dump() when available.
|
||||
*/
|
||||
QDF_BUG(0);
|
||||
qdf_create_work(0, &txrx_pdev->peer_unmap_timer_work,
|
||||
peer_unmap_timer_work_function,
|
||||
NULL);
|
||||
qdf_sched_work(0, &txrx_pdev->peer_unmap_timer_work);
|
||||
} else {
|
||||
ol_txrx_err("Recovery is in progress, ignore!");
|
||||
}
|
||||
|
@@ -128,6 +128,7 @@ void *ol_txrx_find_peer_by_addr(struct cdp_pdev *pdev,
|
||||
uint8_t *peer_id);
|
||||
|
||||
void htt_pkt_log_init(struct cdp_pdev *pdev_handle, void *scn);
|
||||
void peer_unmap_timer_work_function(void *);
|
||||
void peer_unmap_timer_handler(void *data);
|
||||
|
||||
#endif /* _OL_TXRX__H_ */
|
||||
|
@@ -974,6 +974,7 @@ struct ol_txrx_pdev_t {
|
||||
qdf_atomic_t lro_dev_cnt;
|
||||
} lro_info;
|
||||
struct ol_txrx_peer_t *self_peer;
|
||||
qdf_work_t peer_unmap_timer_work;
|
||||
};
|
||||
|
||||
struct ol_txrx_vdev_t {
|
||||
|
Reference in New Issue
Block a user