qcacmn: Handle Umac post reset at host

Handle Umac post reset and post reset complete
events from firmware.

Change-Id: I76ac1b96f01f026535d31edcbd245b3643ecf6ee
CRs-Fixed: 3267222
Cette révision appartient à :
Pavankumar Nandeshwar
2022-08-12 10:30:14 -07:00
révisé par Madan Koyyalamudi
Parent 1e28e45ce7
révision 67de6bcbfd
18 fichiers modifiés avec 526 ajouts et 60 suppressions

Voir le fichier

@@ -2068,30 +2068,41 @@ static inline void dp_tx_update_mesh_flags(struct dp_soc *soc,
* dp_mesh_tx_comp_free_buff() - Free the mesh tx packet buffer
* @soc: dp_soc handle
* @tx_desc: TX descriptor
* @vdev: datapath vdev handle
* @delayed_free: delay the nbuf free
*
* Return: None
* Return: nbuf to be freed late
*/
static inline void dp_mesh_tx_comp_free_buff(struct dp_soc *soc,
struct dp_tx_desc_s *tx_desc)
static inline qdf_nbuf_t dp_mesh_tx_comp_free_buff(struct dp_soc *soc,
struct dp_tx_desc_s *tx_desc,
bool delayed_free)
{
qdf_nbuf_t nbuf = tx_desc->nbuf;
struct dp_vdev *vdev = NULL;
vdev = dp_vdev_get_ref_by_id(soc, tx_desc->vdev_id, DP_MOD_ID_MESH);
if (tx_desc->flags & DP_TX_DESC_FLAG_TO_FW) {
qdf_nbuf_free(nbuf);
DP_STATS_INC(vdev, tx_i.mesh.completion_fw, 1);
} else {
vdev = dp_vdev_get_ref_by_id(soc, tx_desc->vdev_id,
DP_MOD_ID_MESH);
if (vdev && vdev->osif_tx_free_ext)
vdev->osif_tx_free_ext((nbuf));
else
qdf_nbuf_free(nbuf);
if (vdev)
dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_MESH);
DP_STATS_INC(vdev, tx_i.mesh.completion_fw, 1);
if (delayed_free)
return nbuf;
qdf_nbuf_free(nbuf);
} else {
if (vdev && vdev->osif_tx_free_ext) {
vdev->osif_tx_free_ext((nbuf));
} else {
if (delayed_free)
return nbuf;
qdf_nbuf_free(nbuf);
}
}
if (vdev)
dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_MESH);
return NULL;
}
#else
static inline void dp_tx_update_mesh_flags(struct dp_soc *soc,
@@ -2100,9 +2111,11 @@ static inline void dp_tx_update_mesh_flags(struct dp_soc *soc,
{
}
static inline void dp_mesh_tx_comp_free_buff(struct dp_soc *soc,
struct dp_tx_desc_s *tx_desc)
static inline qdf_nbuf_t dp_mesh_tx_comp_free_buff(struct dp_soc *soc,
struct dp_tx_desc_s *tx_desc,
bool delayed_free)
{
return NULL;
}
#endif
@@ -2297,21 +2310,25 @@ fail_return:
* dp_tx_comp_free_buf() - Free nbuf associated with the Tx Descriptor
* @soc: Soc handle
* @desc: software Tx descriptor to be processed
* @delayed_free: defer freeing of nbuf
*
* Return: none
* Return: nbuf to be freed later
*/
void dp_tx_comp_free_buf(struct dp_soc *soc, struct dp_tx_desc_s *desc)
qdf_nbuf_t dp_tx_comp_free_buf(struct dp_soc *soc, struct dp_tx_desc_s *desc,
bool delayed_free)
{
qdf_nbuf_t nbuf = desc->nbuf;
enum dp_tx_event_type type = dp_tx_get_event_type(desc->flags);
/* nbuf already freed in vdev detach path */
if (!nbuf)
return;
return NULL;
/* If it is TDLS mgmt, don't unmap or free the frame */
if (desc->flags & DP_TX_DESC_FLAG_TDLS_FRAME)
return dp_non_std_htt_tx_comp_free_buff(soc, desc);
if (desc->flags & DP_TX_DESC_FLAG_TDLS_FRAME) {
dp_non_std_htt_tx_comp_free_buff(soc, desc);
return NULL;
}
/* 0 : MSDU buffer, 1 : MLE */
if (desc->msdu_ext_desc) {
@@ -2328,8 +2345,7 @@ void dp_tx_comp_free_buf(struct dp_soc *soc, struct dp_tx_desc_s *desc)
desc->msdu_ext_desc->tso_desc,
desc->msdu_ext_desc->
tso_num_desc);
qdf_nbuf_free(nbuf);
return;
goto nbuf_free;
}
if (qdf_unlikely(desc->frm_type == dp_tx_frm_sg)) {
@@ -2353,8 +2369,7 @@ void dp_tx_comp_free_buf(struct dp_soc *soc, struct dp_tx_desc_s *desc)
QDF_DMA_TO_DEVICE);
}
qdf_nbuf_free(nbuf);
return;
goto nbuf_free;
}
}
/* If it's ME frame, dont unmap the cloned nbuf's */
@@ -2365,13 +2380,18 @@ void dp_tx_comp_free_buf(struct dp_soc *soc, struct dp_tx_desc_s *desc)
dp_tx_unmap(soc, desc);
if (desc->flags & DP_TX_DESC_FLAG_MESH_MODE)
return dp_mesh_tx_comp_free_buff(soc, desc);
return dp_mesh_tx_comp_free_buff(soc, desc, delayed_free);
if (dp_tx_traffic_end_indication_enq_ind_pkt(soc, desc, nbuf))
return;
return NULL;
nbuf_free:
if (delayed_free)
return nbuf;
qdf_nbuf_free(nbuf);
return NULL;
}
/**
@@ -2613,7 +2633,7 @@ qdf_nbuf_t dp_tx_send_msdu_multiple(struct dp_vdev *vdev, qdf_nbuf_t nbuf,
* unmap and free current,
* retransmit remaining segments
*/
dp_tx_comp_free_buf(soc, tx_desc);
dp_tx_comp_free_buf(soc, tx_desc, false);
i++;
dp_tx_desc_release(tx_desc, tx_q->desc_pool_id);
continue;
@@ -4562,7 +4582,7 @@ dp_tx_comp_process_desc(struct dp_soc *soc,
}
desc->flags |= DP_TX_DESC_FLAG_COMPLETED_TX;
dp_tx_comp_free_buf(soc, desc);
dp_tx_comp_free_buf(soc, desc, false);
}
#ifdef DISABLE_DP_STATS
@@ -5329,7 +5349,7 @@ more_data:
dp_tx_comp_info_rl("pdev in down state %d",
tx_desc->id);
tx_desc->flags |= DP_TX_DESC_FLAG_TX_COMP_ERR;
dp_tx_comp_free_buf(soc, tx_desc);
dp_tx_comp_free_buf(soc, tx_desc, false);
dp_tx_desc_release(tx_desc, tx_desc->pool_id);
goto next_desc;
}
@@ -5606,7 +5626,8 @@ void dp_tx_desc_flush(struct dp_pdev *pdev, struct dp_vdev *vdev,
*/
if (force_free) {
tx_desc->flags |= DP_TX_DESC_FLAG_FLUSH;
dp_tx_comp_free_buf(soc, tx_desc);
dp_tx_comp_free_buf(soc, tx_desc,
false);
dp_tx_desc_release(tx_desc, i);
} else {
tx_desc->vdev_id = DP_INVALID_VDEV_ID;
@@ -5670,7 +5691,8 @@ void dp_tx_desc_flush(struct dp_pdev *pdev, struct dp_vdev *vdev,
if (dp_is_tx_desc_flush_match(pdev, vdev, tx_desc)) {
if (force_free) {
tx_desc->flags |= DP_TX_DESC_FLAG_FLUSH;
dp_tx_comp_free_buf(soc, tx_desc);
dp_tx_comp_free_buf(soc, tx_desc,
false);
dp_tx_desc_release(tx_desc, i);
} else {
dp_tx_desc_reset_vdev(soc, tx_desc,