qcacmn: Extending TDLS Peer ops and pause/unpause APIs

Changes are done to extend vdev based pause/unpause to
peer based pauses/unpause. Added changes to mark peer
as tdls peer and supports TDLS offchan operations which
will be used to pause/unpause the peer queues based on
pause type coming with pause event from FW.

Change-Id: I3976501c318ae5a295e71ed2265db04496974c7a
CRs-Fixed: 2508209
This commit is contained in:
nakul kachhwaha
2019-10-24 17:46:02 +05:30
committed by nshrivas
parent 215263ece0
commit f9ae9360f9
3 changed files with 55 additions and 6 deletions

View File

@@ -265,7 +265,7 @@ cdp_fc_vdev_flush(ol_txrx_soc_handle soc, struct cdp_vdev *vdev)
*/ */
static inline void static inline void
cdp_fc_vdev_pause(ol_txrx_soc_handle soc, struct cdp_vdev *vdev, cdp_fc_vdev_pause(ol_txrx_soc_handle soc, struct cdp_vdev *vdev,
uint32_t reason) uint32_t reason, uint32_t pause_type)
{ {
if (!soc || !soc->ops) { if (!soc || !soc->ops) {
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG, QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG,
@@ -278,7 +278,7 @@ cdp_fc_vdev_pause(ol_txrx_soc_handle soc, struct cdp_vdev *vdev,
!soc->ops->l_flowctl_ops->vdev_pause) !soc->ops->l_flowctl_ops->vdev_pause)
return; return;
soc->ops->l_flowctl_ops->vdev_pause(vdev, reason); soc->ops->l_flowctl_ops->vdev_pause(vdev, reason, pause_type);
} }
/** /**
@@ -293,7 +293,7 @@ cdp_fc_vdev_pause(ol_txrx_soc_handle soc, struct cdp_vdev *vdev,
*/ */
static inline void static inline void
cdp_fc_vdev_unpause(ol_txrx_soc_handle soc, struct cdp_vdev *vdev, cdp_fc_vdev_unpause(ol_txrx_soc_handle soc, struct cdp_vdev *vdev,
uint32_t reason) uint32_t reason, uint32_t pause_type)
{ {
if (!soc || !soc->ops) { if (!soc || !soc->ops) {
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG, QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG,
@@ -305,6 +305,6 @@ cdp_fc_vdev_unpause(ol_txrx_soc_handle soc, struct cdp_vdev *vdev,
!soc->ops->l_flowctl_ops->vdev_unpause) !soc->ops->l_flowctl_ops->vdev_unpause)
return; return;
soc->ops->l_flowctl_ops->vdev_unpause(vdev, reason); soc->ops->l_flowctl_ops->vdev_unpause(vdev, reason, pause_type);
} }
#endif /* _CDP_TXRX_FC_LEG_H_ */ #endif /* _CDP_TXRX_FC_LEG_H_ */

View File

@@ -1157,6 +1157,8 @@ struct cdp_peer_ops {
void (*update_last_real_peer)(struct cdp_pdev *pdev, void *vdev, void (*update_last_real_peer)(struct cdp_pdev *pdev, void *vdev,
uint8_t *peer_id, bool restore_last_peer); uint8_t *peer_id, bool restore_last_peer);
void (*peer_detach_force_delete)(void *peer); void (*peer_detach_force_delete)(void *peer);
void (*set_tdls_offchan_enabled)(void *peer, bool val);
void (*set_peer_as_tdls_peer)(void *peer, bool val);
}; };
/** /**
@@ -1281,8 +1283,10 @@ struct cdp_lflowctl_ops {
unsigned int high_watermark_offset); unsigned int high_watermark_offset);
int (*ll_set_tx_pause_q_depth)(uint8_t vdev_id, int pause_q_depth); int (*ll_set_tx_pause_q_depth)(uint8_t vdev_id, int pause_q_depth);
void (*vdev_flush)(struct cdp_vdev *vdev); void (*vdev_flush)(struct cdp_vdev *vdev);
void (*vdev_pause)(struct cdp_vdev *vdev, uint32_t reason); void (*vdev_pause)(struct cdp_vdev *vdev, uint32_t reason,
void (*vdev_unpause)(struct cdp_vdev *vdev, uint32_t reason); uint32_t pause_type);
void (*vdev_unpause)(struct cdp_vdev *vdev, uint32_t reason,
uint32_t pause_type);
}; };
/** /**

View File

@@ -675,4 +675,49 @@ is_cdp_peer_detach_force_delete_supported(ol_txrx_soc_handle soc)
return false; return false;
} }
/*
* cdp_peer_set_peer_as_tdls() - To set peer as tdls peer
* @soc: pointer to SOC handle
* @peer: dp peer
* @var: true or false
*
* Return: void
*/
static inline void
cdp_peer_set_peer_as_tdls(ol_txrx_soc_handle soc, void *peer, bool val)
{
if (!soc || !soc->ops || !soc->ops->peer_ops) {
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
"%s invalid instance", __func__);
return;
}
if (soc->ops->peer_ops->set_peer_as_tdls_peer)
soc->ops->peer_ops->set_peer_as_tdls_peer(peer, val);
}
/**
* cdp_peer_set_tdls_offchan_enabled() - Set tdls offchan operation as enabled
* @soc - data path soc handle
* @peer - peer instance pointer
* @val - true or false
*
* update tdls_offchan_enabled
*
* Return: none
*/
static inline void
cdp_peer_set_tdls_offchan_enabled(ol_txrx_soc_handle soc, void *peer, bool val)
{
if (!soc || !soc->ops || !soc->ops->peer_ops) {
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
"%s invalid instance", __func__);
return;
}
if (soc->ops->peer_ops->set_tdls_offchan_enabled)
soc->ops->peer_ops->set_tdls_offchan_enabled(peer, val);
}
#endif /* _CDP_TXRX_PEER_H_ */ #endif /* _CDP_TXRX_PEER_H_ */