qcacld-3.0: Add macros to inc/dec peer->ref_cnt
Currently peer ref_cnt increments and decrements are done by the caller function. Wrap peer->ref_cnt increment and decrement into MACRO calls so they can be tracked. Change-Id: I64d8b85d5898545bbc5a4b81101d1fd306de3fc9 CRs-Fixed: 2005652
This commit is contained in:
@@ -1524,7 +1524,7 @@ int ol_txrx_mgmt_send_frame(
|
|||||||
1 /* error */);
|
1 /* error */);
|
||||||
if (tx_msdu_info->peer) {
|
if (tx_msdu_info->peer) {
|
||||||
/* remove the peer reference added above */
|
/* remove the peer reference added above */
|
||||||
ol_txrx_peer_unref_delete(tx_msdu_info->peer);
|
OL_TXRX_PEER_UNREF_DELETE(tx_msdu_info->peer);
|
||||||
}
|
}
|
||||||
return 1; /* can't accept the tx mgmt frame */
|
return 1; /* can't accept the tx mgmt frame */
|
||||||
}
|
}
|
||||||
@@ -1549,7 +1549,7 @@ int ol_txrx_mgmt_send_frame(
|
|||||||
ol_tx_enqueue(vdev->pdev, txq, tx_desc, tx_msdu_info);
|
ol_tx_enqueue(vdev->pdev, txq, tx_desc, tx_msdu_info);
|
||||||
if (tx_msdu_info->peer) {
|
if (tx_msdu_info->peer) {
|
||||||
/* remove the peer reference added above */
|
/* remove the peer reference added above */
|
||||||
ol_txrx_peer_unref_delete(tx_msdu_info->peer);
|
OL_TXRX_PEER_UNREF_DELETE(tx_msdu_info->peer);
|
||||||
}
|
}
|
||||||
ol_tx_sched(vdev->pdev);
|
ol_tx_sched(vdev->pdev);
|
||||||
|
|
||||||
@@ -1739,7 +1739,7 @@ ol_tx_hl_base(
|
|||||||
if (tx_msdu_info.peer) {
|
if (tx_msdu_info.peer) {
|
||||||
/* remove the peer reference
|
/* remove the peer reference
|
||||||
* added above */
|
* added above */
|
||||||
ol_txrx_peer_unref_delete(
|
OL_TXRX_PEER_UNREF_DELETE(
|
||||||
tx_msdu_info.peer);
|
tx_msdu_info.peer);
|
||||||
}
|
}
|
||||||
goto MSDU_LOOP_BOTTOM;
|
goto MSDU_LOOP_BOTTOM;
|
||||||
@@ -1757,7 +1757,7 @@ ol_tx_hl_base(
|
|||||||
ol_tx_desc_frame_free_nonstd(pdev,
|
ol_tx_desc_frame_free_nonstd(pdev,
|
||||||
tx_desc,
|
tx_desc,
|
||||||
1);
|
1);
|
||||||
ol_txrx_peer_unref_delete(
|
OL_TXRX_PEER_UNREF_DELETE(
|
||||||
tx_msdu_info.peer);
|
tx_msdu_info.peer);
|
||||||
msdu = next;
|
msdu = next;
|
||||||
continue;
|
continue;
|
||||||
@@ -1773,7 +1773,7 @@ ol_tx_hl_base(
|
|||||||
ol_tx_desc_frame_free_nonstd(
|
ol_tx_desc_frame_free_nonstd(
|
||||||
pdev,
|
pdev,
|
||||||
tx_desc, 1);
|
tx_desc, 1);
|
||||||
ol_txrx_peer_unref_delete(
|
OL_TXRX_PEER_UNREF_DELETE(
|
||||||
tx_msdu_info.peer);
|
tx_msdu_info.peer);
|
||||||
msdu = next;
|
msdu = next;
|
||||||
continue;
|
continue;
|
||||||
@@ -1822,7 +1822,7 @@ ol_tx_hl_base(
|
|||||||
OL_TX_PEER_STATS_UPDATE(tx_msdu_info.peer,
|
OL_TX_PEER_STATS_UPDATE(tx_msdu_info.peer,
|
||||||
msdu);
|
msdu);
|
||||||
/* remove the peer reference added above */
|
/* remove the peer reference added above */
|
||||||
ol_txrx_peer_unref_delete(tx_msdu_info.peer);
|
OL_TXRX_PEER_UNREF_DELETE(tx_msdu_info.peer);
|
||||||
}
|
}
|
||||||
MSDU_LOOP_BOTTOM:
|
MSDU_LOOP_BOTTOM:
|
||||||
msdu = next;
|
msdu = next;
|
||||||
|
@@ -357,7 +357,7 @@ struct ol_txrx_peer_t *ol_tx_tdls_peer_find(struct ol_txrx_pdev_t *pdev,
|
|||||||
peer = NULL;
|
peer = NULL;
|
||||||
} else {
|
} else {
|
||||||
if (peer)
|
if (peer)
|
||||||
qdf_atomic_inc(&peer->ref_cnt);
|
OL_TXRX_PEER_INC_REF_CNT(peer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!peer)
|
if (!peer)
|
||||||
@@ -582,7 +582,7 @@ ol_tx_classify(
|
|||||||
"%s: remove the peer for invalid peer_id %p\n",
|
"%s: remove the peer for invalid peer_id %p\n",
|
||||||
__func__, peer);
|
__func__, peer);
|
||||||
/* remove the peer reference added above */
|
/* remove the peer reference added above */
|
||||||
ol_txrx_peer_unref_delete(peer);
|
OL_TXRX_PEER_UNREF_DELETE(peer);
|
||||||
tx_msdu_info->peer = NULL;
|
tx_msdu_info->peer = NULL;
|
||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -605,7 +605,7 @@ ol_tx_classify(
|
|||||||
"%s: remove the peer reference %p\n",
|
"%s: remove the peer reference %p\n",
|
||||||
__func__, peer);
|
__func__, peer);
|
||||||
/* remove the peer reference added above */
|
/* remove the peer reference added above */
|
||||||
ol_txrx_peer_unref_delete(tx_msdu_info->peer);
|
OL_TXRX_PEER_UNREF_DELETE(tx_msdu_info->peer);
|
||||||
/* Making peer NULL in case if multicast non STA mode */
|
/* Making peer NULL in case if multicast non STA mode */
|
||||||
tx_msdu_info->peer = NULL;
|
tx_msdu_info->peer = NULL;
|
||||||
}
|
}
|
||||||
@@ -688,11 +688,7 @@ ol_tx_classify_mgmt(
|
|||||||
if (ol_txrx_peer_find_mac_addr_cmp(
|
if (ol_txrx_peer_find_mac_addr_cmp(
|
||||||
mac_addr,
|
mac_addr,
|
||||||
&peer->mac_addr) != 0) {
|
&peer->mac_addr) != 0) {
|
||||||
rcnt = ol_txrx_peer_unref_delete(peer);
|
rcnt = OL_TXRX_PEER_UNREF_DELETE(peer);
|
||||||
QDF_TRACE(QDF_MODULE_ID_TXRX,
|
|
||||||
QDF_TRACE_LEVEL_INFO_HIGH,
|
|
||||||
"%s: peer %p peer->ref_cnt %d",
|
|
||||||
__func__, peer, rcnt);
|
|
||||||
peer = NULL;
|
peer = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -111,13 +111,7 @@ ol_tx_queue_vdev_flush(struct ol_txrx_pdev_t *pdev, struct ol_txrx_vdev_t *vdev)
|
|||||||
for (i = 0; i < OL_TX_NUM_TIDS; i++) {
|
for (i = 0; i < OL_TX_NUM_TIDS; i++) {
|
||||||
txq = &peer->txqs[i];
|
txq = &peer->txqs[i];
|
||||||
if (txq->frms) {
|
if (txq->frms) {
|
||||||
qdf_atomic_inc(&peer->ref_cnt);
|
OL_TXRX_PEER_INC_REF_CNT(peer);
|
||||||
QDF_TRACE(QDF_MODULE_ID_TXRX,
|
|
||||||
QDF_TRACE_LEVEL_INFO_HIGH,
|
|
||||||
"%s: peer %p peer->ref_cnt %d",
|
|
||||||
__func__, peer,
|
|
||||||
qdf_atomic_read
|
|
||||||
(&peer->ref_cnt));
|
|
||||||
peers[peer_count++] = peer;
|
peers[peer_count++] = peer;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -135,7 +129,7 @@ ol_tx_queue_vdev_flush(struct ol_txrx_pdev_t *pdev, struct ol_txrx_vdev_t *vdev)
|
|||||||
}
|
}
|
||||||
ol_txrx_info(
|
ol_txrx_info(
|
||||||
"%s: Delete Peer %p\n", __func__, peer);
|
"%s: Delete Peer %p\n", __func__, peer);
|
||||||
ol_txrx_peer_unref_delete(peers[i]);
|
OL_TXRX_PEER_UNREF_DELETE(peers[i]);
|
||||||
}
|
}
|
||||||
} while (peer_count >= PEER_ARRAY_COUNT);
|
} while (peer_count >= PEER_ARRAY_COUNT);
|
||||||
}
|
}
|
||||||
|
@@ -310,10 +310,7 @@ ol_txrx_find_peer_by_addr_and_vdev(struct cdp_pdev *ppdev,
|
|||||||
if (!peer)
|
if (!peer)
|
||||||
return NULL;
|
return NULL;
|
||||||
*peer_id = peer->local_id;
|
*peer_id = peer->local_id;
|
||||||
qdf_atomic_dec(&peer->ref_cnt);
|
OL_TXRX_PEER_DEC_REF_CNT(peer);
|
||||||
QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_INFO_HIGH,
|
|
||||||
"%s: peer %p peer->ref_cnt %d", __func__, peer,
|
|
||||||
qdf_atomic_read(&peer->ref_cnt));
|
|
||||||
return peer;
|
return peer;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -369,11 +366,8 @@ void *ol_txrx_find_peer_by_addr(struct cdp_pdev *ppdev,
|
|||||||
if (!peer)
|
if (!peer)
|
||||||
return NULL;
|
return NULL;
|
||||||
*peer_id = peer->local_id;
|
*peer_id = peer->local_id;
|
||||||
qdf_atomic_dec(&peer->ref_cnt);
|
OL_TXRX_PEER_DEC_REF_CNT(peer);
|
||||||
QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_INFO_HIGH,
|
return peer;
|
||||||
"%s: peer %p peer->ref_cnt %d", __func__, peer,
|
|
||||||
qdf_atomic_read(&peer->ref_cnt));
|
|
||||||
return (void *)peer;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint16_t ol_txrx_local_peer_id(void *ppeer)
|
static uint16_t ol_txrx_local_peer_id(void *ppeer)
|
||||||
@@ -2505,7 +2499,7 @@ ol_txrx_peer_attach(struct cdp_vdev *pvdev, uint8_t *peer_mac_addr)
|
|||||||
qdf_atomic_init(&peer->ref_cnt);
|
qdf_atomic_init(&peer->ref_cnt);
|
||||||
|
|
||||||
/* keep one reference for attach */
|
/* keep one reference for attach */
|
||||||
qdf_atomic_inc(&peer->ref_cnt);
|
OL_TXRX_PEER_INC_REF_CNT(peer);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Set a flag to indicate peer create is pending in firmware and
|
* Set a flag to indicate peer create is pending in firmware and
|
||||||
@@ -2516,7 +2510,7 @@ ol_txrx_peer_attach(struct cdp_vdev *pvdev, uint8_t *peer_mac_addr)
|
|||||||
*/
|
*/
|
||||||
qdf_atomic_init(&peer->fw_create_pending);
|
qdf_atomic_init(&peer->fw_create_pending);
|
||||||
qdf_atomic_set(&peer->fw_create_pending, 1);
|
qdf_atomic_set(&peer->fw_create_pending, 1);
|
||||||
qdf_atomic_inc(&peer->ref_cnt);
|
OL_TXRX_PEER_INC_REF_CNT(peer);
|
||||||
|
|
||||||
peer->valid = 1;
|
peer->valid = 1;
|
||||||
qdf_timer_init(pdev->osdev, &peer->peer_unmap_timer,
|
qdf_timer_init(pdev->osdev, &peer->peer_unmap_timer,
|
||||||
@@ -2943,11 +2937,7 @@ QDF_STATUS ol_txrx_peer_state_update(struct cdp_pdev *ppdev,
|
|||||||
"%s: no state change, returns directly\n",
|
"%s: no state change, returns directly\n",
|
||||||
__func__);
|
__func__);
|
||||||
#endif
|
#endif
|
||||||
peer_ref_cnt = ol_txrx_peer_unref_delete(peer);
|
peer_ref_cnt = OL_TXRX_PEER_UNREF_DELETE(peer);
|
||||||
QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_INFO_HIGH,
|
|
||||||
"%s: peer %p peer->ref_cnt %d",
|
|
||||||
__func__, peer, peer_ref_cnt);
|
|
||||||
|
|
||||||
return QDF_STATUS_SUCCESS;
|
return QDF_STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2977,15 +2967,12 @@ QDF_STATUS ol_txrx_peer_state_update(struct cdp_pdev *ppdev,
|
|||||||
ol_txrx_peer_tid_unpause(peer, tid);
|
ol_txrx_peer_tid_unpause(peer, tid);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
peer_ref_cnt = ol_txrx_peer_unref_delete(peer);
|
peer_ref_cnt = OL_TXRX_PEER_UNREF_DELETE(peer);
|
||||||
QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_INFO_HIGH,
|
|
||||||
"%s: peer %p peer->ref_cnt %d",
|
|
||||||
__func__, peer, peer_ref_cnt);
|
|
||||||
/*
|
/*
|
||||||
* after ol_txrx_peer_unref_delete, peer object cannot be accessed
|
* after OL_TXRX_PEER_UNREF_DELETE, peer object cannot be accessed
|
||||||
* if the return code was 0
|
* if the return code was 0
|
||||||
*/
|
*/
|
||||||
if (peer_ref_cnt)
|
if (peer_ref_cnt > 0)
|
||||||
/*
|
/*
|
||||||
* Set the state after the Pause to avoid the race condiction
|
* Set the state after the Pause to avoid the race condiction
|
||||||
* with ADDBA check in tx path
|
* with ADDBA check in tx path
|
||||||
@@ -3090,10 +3077,7 @@ ol_txrx_peer_update(ol_txrx_vdev_handle vdev,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} /* switch */
|
} /* switch */
|
||||||
peer_ref_cnt = ol_txrx_peer_unref_delete(peer);
|
peer_ref_cnt = OL_TXRX_PEER_UNREF_DELETE(peer);
|
||||||
QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_INFO_HIGH,
|
|
||||||
"%s: peer %p peer->ref_cnt %d",
|
|
||||||
__func__, peer, peer_ref_cnt);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t
|
uint8_t
|
||||||
@@ -3119,7 +3103,9 @@ ol_txrx_peer_qoscapable_get(struct ol_txrx_pdev_t *txrx_pdev, uint16_t peer_id)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ol_txrx_peer_unref_delete(ol_txrx_peer_handle peer)
|
int ol_txrx_peer_unref_delete(ol_txrx_peer_handle peer,
|
||||||
|
const char *fname,
|
||||||
|
int line)
|
||||||
{
|
{
|
||||||
int rc;
|
int rc;
|
||||||
struct ol_txrx_vdev_t *vdev;
|
struct ol_txrx_vdev_t *vdev;
|
||||||
@@ -3285,8 +3271,8 @@ int ol_txrx_peer_unref_delete(ol_txrx_peer_handle peer)
|
|||||||
} else {
|
} else {
|
||||||
qdf_spin_unlock_bh(&pdev->peer_ref_mutex);
|
qdf_spin_unlock_bh(&pdev->peer_ref_mutex);
|
||||||
QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_DEBUG,
|
QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_DEBUG,
|
||||||
"%s: peer %p peer->ref_cnt = %d",
|
"ref delete(%s): peer %p peer->ref_cnt = %d",
|
||||||
__func__, peer, rc);
|
fname, peer, rc);
|
||||||
}
|
}
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
@@ -3449,7 +3435,7 @@ static void ol_txrx_peer_detach(void *ppeer)
|
|||||||
* PEER_UNMAP message arrives to remove the other
|
* PEER_UNMAP message arrives to remove the other
|
||||||
* reference, added by the PEER_MAP message.
|
* reference, added by the PEER_MAP message.
|
||||||
*/
|
*/
|
||||||
ol_txrx_peer_unref_delete(peer);
|
OL_TXRX_PEER_UNREF_DELETE(peer);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -3477,7 +3463,7 @@ static void ol_txrx_peer_detach_force_delete(void *ppeer)
|
|||||||
qdf_spin_unlock_bh(&pdev->peer_map_unmap_lock);
|
qdf_spin_unlock_bh(&pdev->peer_map_unmap_lock);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Set ref_cnt = 1 so that ol_txrx_peer_unref_delete() called by
|
* Set ref_cnt = 1 so that OL_TXRX_PEER_UNREF_DELETE() called by
|
||||||
* ol_txrx_peer_detach() will actually delete this peer entry properly.
|
* ol_txrx_peer_detach() will actually delete this peer entry properly.
|
||||||
*/
|
*/
|
||||||
qdf_spin_lock_bh(&pdev->peer_ref_mutex);
|
qdf_spin_lock_bh(&pdev->peer_ref_mutex);
|
||||||
@@ -3497,7 +3483,7 @@ ol_txrx_peer_find_by_addr(struct ol_txrx_pdev_t *pdev, uint8_t *peer_mac_addr)
|
|||||||
ol_txrx_info_high(
|
ol_txrx_info_high(
|
||||||
"%s: Delete extra reference %p", __func__, peer);
|
"%s: Delete extra reference %p", __func__, peer);
|
||||||
/* release the extra reference */
|
/* release the extra reference */
|
||||||
ol_txrx_peer_unref_delete(peer);
|
OL_TXRX_PEER_UNREF_DELETE(peer);
|
||||||
}
|
}
|
||||||
return peer;
|
return peer;
|
||||||
}
|
}
|
||||||
|
@@ -39,8 +39,13 @@
|
|||||||
* only for forwarding path.
|
* only for forwarding path.
|
||||||
*/
|
*/
|
||||||
#define OL_TX_NON_FWD_RESERVE 100
|
#define OL_TX_NON_FWD_RESERVE 100
|
||||||
|
#define OL_TXRX_PEER_UNREF_DELETE(peer) \
|
||||||
|
ol_txrx_peer_unref_delete(peer, __func__, __LINE__);
|
||||||
|
|
||||||
|
int ol_txrx_peer_unref_delete(ol_txrx_peer_handle peer,
|
||||||
|
const char *fname,
|
||||||
|
int line);
|
||||||
|
|
||||||
int ol_txrx_peer_unref_delete(struct ol_txrx_peer_t *peer);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ol_tx_desc_pool_size_hl() - allocate tx descriptor pool size for HL systems
|
* ol_tx_desc_pool_size_hl() - allocate tx descriptor pool size for HL systems
|
||||||
|
@@ -69,6 +69,26 @@ static int ol_txrx_log2_ceil(unsigned int value)
|
|||||||
return log2;
|
return log2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* __ol_txrx_peer_change_ref_cnt() - change peer ref count by the input value
|
||||||
|
* @peer: pointer to peer structure
|
||||||
|
* @change: value to add to the peer->ref_cnt, can be negative
|
||||||
|
* @fname: name of the calling function
|
||||||
|
* @line: line number of the calling function
|
||||||
|
*
|
||||||
|
* Return: the QDF_STATUS return from hdd_execute_config_command
|
||||||
|
*/
|
||||||
|
void __ol_txrx_peer_change_ref_cnt(struct ol_txrx_peer_t *peer,
|
||||||
|
int change,
|
||||||
|
const char *fname,
|
||||||
|
int line)
|
||||||
|
{
|
||||||
|
qdf_atomic_add(change, &peer->ref_cnt);
|
||||||
|
QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_INFO_HIGH,
|
||||||
|
"[%s][%d]: peer %p peer->ref_cnt changed by(%d) to %d",
|
||||||
|
fname, line, peer, change, qdf_atomic_read(&peer->ref_cnt));
|
||||||
|
}
|
||||||
|
|
||||||
/*=== function definitions for peer MAC addr --> peer object hash table =====*/
|
/*=== function definitions for peer MAC addr --> peer object hash table =====*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -178,15 +198,9 @@ struct ol_txrx_peer_t *ol_txrx_peer_vdev_find_hash(struct ol_txrx_pdev_t *pdev,
|
|||||||
if (ol_txrx_peer_find_mac_addr_cmp(mac_addr, &peer->mac_addr) ==
|
if (ol_txrx_peer_find_mac_addr_cmp(mac_addr, &peer->mac_addr) ==
|
||||||
0 && (check_valid == 0 || peer->valid)
|
0 && (check_valid == 0 || peer->valid)
|
||||||
&& peer->vdev == vdev) {
|
&& peer->vdev == vdev) {
|
||||||
/*
|
|
||||||
* found it - increment the ref count before releasing
|
/* found it */
|
||||||
* the lock
|
OL_TXRX_PEER_INC_REF_CNT(peer);
|
||||||
*/
|
|
||||||
qdf_atomic_inc(&peer->ref_cnt);
|
|
||||||
QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_INFO_HIGH,
|
|
||||||
"%s: peer %p peer->ref_cnt %d",
|
|
||||||
__func__, peer,
|
|
||||||
qdf_atomic_read(&peer->ref_cnt));
|
|
||||||
qdf_spin_unlock_bh(&pdev->peer_ref_mutex);
|
qdf_spin_unlock_bh(&pdev->peer_ref_mutex);
|
||||||
return peer;
|
return peer;
|
||||||
}
|
}
|
||||||
@@ -216,16 +230,9 @@ struct ol_txrx_peer_t *ol_txrx_peer_find_hash_find(struct ol_txrx_pdev_t *pdev,
|
|||||||
TAILQ_FOREACH(peer, &pdev->peer_hash.bins[index], hash_list_elem) {
|
TAILQ_FOREACH(peer, &pdev->peer_hash.bins[index], hash_list_elem) {
|
||||||
if (ol_txrx_peer_find_mac_addr_cmp(mac_addr, &peer->mac_addr) ==
|
if (ol_txrx_peer_find_mac_addr_cmp(mac_addr, &peer->mac_addr) ==
|
||||||
0 && (check_valid == 0 || peer->valid)) {
|
0 && (check_valid == 0 || peer->valid)) {
|
||||||
/*
|
/* found it */
|
||||||
* found it - increment the ref count before
|
OL_TXRX_PEER_INC_REF_CNT(peer);
|
||||||
* releasing the lock
|
|
||||||
*/
|
|
||||||
qdf_atomic_inc(&peer->ref_cnt);
|
|
||||||
qdf_spin_unlock_bh(&pdev->peer_ref_mutex);
|
qdf_spin_unlock_bh(&pdev->peer_ref_mutex);
|
||||||
QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_INFO_HIGH,
|
|
||||||
"%s: peer %p peer->ref_cnt %d",
|
|
||||||
__func__, peer,
|
|
||||||
qdf_atomic_read(&peer->ref_cnt));
|
|
||||||
return peer;
|
return peer;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -286,16 +293,11 @@ void ol_txrx_peer_find_hash_erase(struct ol_txrx_pdev_t *pdev)
|
|||||||
/*
|
/*
|
||||||
* Artificially adjust the peer's ref count to
|
* Artificially adjust the peer's ref count to
|
||||||
* 1, so it will get deleted by
|
* 1, so it will get deleted by
|
||||||
* ol_txrx_peer_unref_delete.
|
* OL_TXRX_PEER_UNREF_DELETE.
|
||||||
*/
|
*/
|
||||||
qdf_atomic_init(&peer->ref_cnt); /* set to 0 */
|
qdf_atomic_init(&peer->ref_cnt); /* set to 0 */
|
||||||
qdf_atomic_inc(&peer->ref_cnt); /* incr to 1 */
|
OL_TXRX_PEER_INC_REF_CNT(peer); /* incr to 1 */
|
||||||
QDF_TRACE(QDF_MODULE_ID_TXRX,
|
OL_TXRX_PEER_UNREF_DELETE(peer);
|
||||||
QDF_TRACE_LEVEL_INFO_HIGH,
|
|
||||||
"%s: Delete Peer %p ref_cnt %d\n",
|
|
||||||
__func__, peer,
|
|
||||||
qdf_atomic_read(&peer->ref_cnt));
|
|
||||||
ol_txrx_peer_unref_delete(peer);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -345,6 +347,8 @@ static inline void ol_txrx_peer_find_add_id(struct ol_txrx_pdev_t *pdev,
|
|||||||
struct ol_txrx_peer_t *peer;
|
struct ol_txrx_peer_t *peer;
|
||||||
int status;
|
int status;
|
||||||
int i;
|
int i;
|
||||||
|
uint32_t peer_id_ref_cnt;
|
||||||
|
uint32_t peer_ref_cnt;
|
||||||
|
|
||||||
/* check if there's already a peer object with this MAC address */
|
/* check if there's already a peer object with this MAC address */
|
||||||
peer =
|
peer =
|
||||||
@@ -395,18 +399,17 @@ static inline void ol_txrx_peer_find_add_id(struct ol_txrx_pdev_t *pdev,
|
|||||||
* was sent to firmware.
|
* was sent to firmware.
|
||||||
*/
|
*/
|
||||||
qdf_atomic_set(&peer->fw_create_pending, 0);
|
qdf_atomic_set(&peer->fw_create_pending, 0);
|
||||||
ol_txrx_peer_unref_delete(peer);
|
OL_TXRX_PEER_UNREF_DELETE(peer);
|
||||||
}
|
}
|
||||||
|
|
||||||
qdf_spin_unlock(&pdev->peer_map_unmap_lock);
|
qdf_spin_unlock(&pdev->peer_map_unmap_lock);
|
||||||
|
|
||||||
QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
|
peer_id_ref_cnt = qdf_atomic_read(&pdev->
|
||||||
|
peer_id_to_obj_map[peer_id].peer_id_ref_cnt);
|
||||||
|
peer_ref_cnt = qdf_atomic_read(&peer->ref_cnt);
|
||||||
|
QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_INFO_HIGH,
|
||||||
"%s: peer %p ID %d peer_id[%d] peer_id_ref_cnt %d peer->ref_cnt %d",
|
"%s: peer %p ID %d peer_id[%d] peer_id_ref_cnt %d peer->ref_cnt %d",
|
||||||
__func__, peer, peer_id, i,
|
__func__, peer, peer_id, i, peer_id_ref_cnt, peer_ref_cnt);
|
||||||
qdf_atomic_read(&pdev->
|
|
||||||
peer_id_to_obj_map[peer_id].
|
|
||||||
peer_id_ref_cnt),
|
|
||||||
qdf_atomic_read(&peer->ref_cnt));
|
|
||||||
|
|
||||||
if (status) {
|
if (status) {
|
||||||
/* TBDXXX: assert for now */
|
/* TBDXXX: assert for now */
|
||||||
@@ -591,7 +594,7 @@ void ol_rx_peer_unmap_handler(ol_txrx_pdev_handle pdev, uint16_t peer_id)
|
|||||||
* Remove a reference to the peer.
|
* Remove a reference to the peer.
|
||||||
* If there are no more references, delete the peer object.
|
* If there are no more references, delete the peer object.
|
||||||
*/
|
*/
|
||||||
ol_txrx_peer_unref_delete(peer);
|
OL_TXRX_PEER_UNREF_DELETE(peer);
|
||||||
|
|
||||||
QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_DEBUG,
|
QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_DEBUG,
|
||||||
"%s: Remove the ID %d reference to peer %p peer_id_ref_cnt %d",
|
"%s: Remove the ID %d reference to peer %p peer_id_ref_cnt %d",
|
||||||
@@ -633,7 +636,7 @@ void ol_txrx_peer_remove_obj_map_entries(ol_txrx_pdev_handle pdev,
|
|||||||
peer_id, peer_id_ref_cnt, i);
|
peer_id, peer_id_ref_cnt, i);
|
||||||
/*
|
/*
|
||||||
* Transfer peer_id_ref_cnt into del_peer_id_ref_cnt so that
|
* Transfer peer_id_ref_cnt into del_peer_id_ref_cnt so that
|
||||||
* ol_txrx_peer_unref_delete will decrement del_peer_id_ref_cnt
|
* OL_TXRX_PEER_UNREF_DELETE will decrement del_peer_id_ref_cnt
|
||||||
* and any map events will increment peer_id_ref_cnt. Otherwise
|
* and any map events will increment peer_id_ref_cnt. Otherwise
|
||||||
* accounting will be messed up.
|
* accounting will be messed up.
|
||||||
*
|
*
|
||||||
@@ -660,13 +663,8 @@ struct ol_txrx_peer_t *ol_txrx_assoc_peer_find(struct ol_txrx_vdev_t *vdev)
|
|||||||
*/
|
*/
|
||||||
if (vdev->last_real_peer
|
if (vdev->last_real_peer
|
||||||
&& vdev->last_real_peer->peer_ids[0] != HTT_INVALID_PEER_ID) {
|
&& vdev->last_real_peer->peer_ids[0] != HTT_INVALID_PEER_ID) {
|
||||||
qdf_atomic_inc(&vdev->last_real_peer->ref_cnt);
|
OL_TXRX_PEER_INC_REF_CNT(vdev->last_real_peer);
|
||||||
peer = vdev->last_real_peer;
|
peer = vdev->last_real_peer;
|
||||||
QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_INFO_HIGH,
|
|
||||||
"%s: peer %p peer->ref_cnt %d",
|
|
||||||
__func__, peer,
|
|
||||||
qdf_atomic_read
|
|
||||||
(&peer->ref_cnt));
|
|
||||||
} else {
|
} else {
|
||||||
peer = NULL;
|
peer = NULL;
|
||||||
}
|
}
|
||||||
|
@@ -36,6 +36,17 @@
|
|||||||
#include <cdp_txrx_cmn.h> /* ol_txrx_pdev_t, etc. */
|
#include <cdp_txrx_cmn.h> /* ol_txrx_pdev_t, etc. */
|
||||||
#include <ol_txrx_internal.h> /* TXRX_ASSERT */
|
#include <ol_txrx_internal.h> /* TXRX_ASSERT */
|
||||||
|
|
||||||
|
|
||||||
|
#define OL_TXRX_PEER_INC_REF_CNT(peer) \
|
||||||
|
__ol_txrx_peer_change_ref_cnt(peer, 1, __func__, __LINE__);
|
||||||
|
|
||||||
|
#define OL_TXRX_PEER_DEC_REF_CNT(peer) \
|
||||||
|
__ol_txrx_peer_change_ref_cnt(peer, (-1), __func__, __LINE__);
|
||||||
|
|
||||||
|
void __ol_txrx_peer_change_ref_cnt(struct ol_txrx_peer_t *peer,
|
||||||
|
int change,
|
||||||
|
const char *fname,
|
||||||
|
int line);
|
||||||
int ol_txrx_peer_find_attach(struct ol_txrx_pdev_t *pdev);
|
int ol_txrx_peer_find_attach(struct ol_txrx_pdev_t *pdev);
|
||||||
|
|
||||||
void ol_txrx_peer_find_detach(struct ol_txrx_pdev_t *pdev);
|
void ol_txrx_peer_find_detach(struct ol_txrx_pdev_t *pdev);
|
||||||
@@ -107,10 +118,8 @@ ol_txrx_peer_find_hash_remove(struct ol_txrx_pdev_t *pdev,
|
|||||||
void ol_txrx_peer_find_hash_erase(struct ol_txrx_pdev_t *pdev);
|
void ol_txrx_peer_find_hash_erase(struct ol_txrx_pdev_t *pdev);
|
||||||
|
|
||||||
struct ol_txrx_peer_t *ol_txrx_assoc_peer_find(struct ol_txrx_vdev_t *vdev);
|
struct ol_txrx_peer_t *ol_txrx_assoc_peer_find(struct ol_txrx_vdev_t *vdev);
|
||||||
|
|
||||||
void ol_txrx_peer_remove_obj_map_entries(ol_txrx_pdev_handle pdev,
|
void ol_txrx_peer_remove_obj_map_entries(ol_txrx_pdev_handle pdev,
|
||||||
struct ol_txrx_peer_t *peer);
|
struct ol_txrx_peer_t *peer);
|
||||||
|
|
||||||
#if defined(TXRX_DEBUG_LEVEL) && TXRX_DEBUG_LEVEL > 5
|
#if defined(TXRX_DEBUG_LEVEL) && TXRX_DEBUG_LEVEL > 5
|
||||||
void ol_txrx_peer_find_display(ol_txrx_pdev_handle pdev, int indent);
|
void ol_txrx_peer_find_display(ol_txrx_pdev_handle pdev, int indent);
|
||||||
#else
|
#else
|
||||||
|
Reference in New Issue
Block a user