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 à :

révisé par
Madan Koyyalamudi

Parent
1e28e45ce7
révision
67de6bcbfd
@@ -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,
|
||||
|
Référencer dans un nouveau ticket
Bloquer un utilisateur