qcacmn: Provide SON with per peer qos stats

Providing per peer QoS stats to SON via WDI event

Change-Id: Idd3cfbfec332269fdc8ad0ef273674e81d6ee92f
This commit is contained in:
Neha Bisht
2020-08-04 19:26:12 +05:30
committed by snandini
parent 8ea15d977b
commit 8ae1b8a9e3
6 changed files with 75 additions and 30 deletions

View File

@@ -2039,17 +2039,19 @@ struct cdp_tx_completion_msdu {
* @other_msdu_count: Number of MSDUs other than UDP and TCP MSDUs in PPDU * @other_msdu_count: Number of MSDUs other than UDP and TCP MSDUs in PPDU
* @frame_control: frame control field * @frame_control: frame control field
* @frame_control_info_valid: frame_control valid * @frame_control_info_valid: frame_control valid
* @qos_control: qos control field
* @qos_control_info_valid: qos_control valid
* @data_sequence_control_info_valid: data_sequence_control_info valid * @data_sequence_control_info_valid: data_sequence_control_info valid
* @first_data_seq_ctrl: Sequence control field of first data frame * @first_data_seq_ctrl: Sequence control field of first data frame
* @preamble: preamble * @preamble: preamble
* @ht_flag: ht flag * @ht_flag: ht flag
* @vht_flag: vht flag * @vht_flag: vht flag
* @he_re: he_re (range extension) * @he_re: he_re (range extension)
* @mac_addr: Peer MAC Address
* @mpdu_cnt_fcs_ok: Number of MPDUs in PPDU with fcs ok * @mpdu_cnt_fcs_ok: Number of MPDUs in PPDU with fcs ok
* @mpdu_cnt_fcs_err: Number of MPDUs in PPDU with fcs err * @mpdu_cnt_fcs_err: Number of MPDUs in PPDU with fcs err
* @mpdu_fcs_ok_bitmap - MPDU with fcs ok bitmap * @mpdu_fcs_ok_bitmap - MPDU with fcs ok bitmap
* @retried - number of retries * @retried - number of retries
* @mac_addr: Peer MAC Address
*/ */
struct cdp_rx_stats_ppdu_user { struct cdp_rx_stats_ppdu_user {
uint16_t peer_id; uint16_t peer_id;
@@ -2070,19 +2072,21 @@ struct cdp_rx_stats_ppdu_user {
uint16_t other_msdu_count; uint16_t other_msdu_count;
uint16_t frame_control; uint16_t frame_control;
uint8_t frame_control_info_valid; uint8_t frame_control_info_valid;
uint16_t qos_control;
uint8_t qos_control_info_valid;
uint8_t data_sequence_control_info_valid; uint8_t data_sequence_control_info_valid;
uint16_t first_data_seq_ctrl; uint16_t first_data_seq_ctrl;
uint32_t preamble_type; uint32_t preamble_type;
uint16_t ht_flags; uint16_t ht_flags;
uint16_t vht_flags; uint16_t vht_flags;
uint16_t he_flags; uint16_t he_flags;
uint8_t mac_addr[QDF_MAC_ADDR_SIZE];
uint32_t mpdu_cnt_fcs_ok; uint32_t mpdu_cnt_fcs_ok;
uint32_t mpdu_cnt_fcs_err; uint32_t mpdu_cnt_fcs_err;
uint32_t mpdu_fcs_ok_bitmap[QDF_MON_STATUS_MPDU_FCS_BMAP_NWORDS]; uint32_t mpdu_fcs_ok_bitmap[QDF_MON_STATUS_MPDU_FCS_BMAP_NWORDS];
uint32_t mpdu_ok_byte_count; uint32_t mpdu_ok_byte_count;
uint32_t mpdu_err_byte_count; uint32_t mpdu_err_byte_count;
uint32_t retries; uint32_t retries;
uint8_t mac_addr[QDF_MAC_ADDR_SIZE];
}; };
/** /**

View File

@@ -360,6 +360,7 @@ enum WDI_EVENT {
WDI_EVENT_FLUSH_RATE_STATS_REQ, WDI_EVENT_FLUSH_RATE_STATS_REQ,
WDI_EVENT_RX_MPDU, WDI_EVENT_RX_MPDU,
WDI_EVENT_HMWDS_AST_ADD_STATUS, WDI_EVENT_HMWDS_AST_ADD_STATUS,
WDI_EVENT_PEER_QOS_STATS,
/* End of new event items */ /* End of new event items */
WDI_EVENT_LAST WDI_EVENT_LAST
}; };
@@ -1317,6 +1318,23 @@ struct cdp_interface_peer_stats {
uint32_t ack_rssi; uint32_t ack_rssi;
}; };
/* struct cdp_interface_peer_qos_stats - interface structure for peer qos stats
* @peer_mac: peer mac address
* @frame_control: frame control field
* @qos_control: qos control field
* @frame_control_info_valid: frame_control valid
* @qos_control_info_valid: qos_control valid
* @vdev_id : vdev_id for the peer
*/
struct cdp_interface_peer_qos_stats {
uint8_t peer_mac[QDF_MAC_ADDR_SIZE];
uint16_t frame_control;
uint16_t qos_control;
uint8_t frame_control_info_valid;
uint8_t qos_control_info_valid;
uint8_t vdev_id;
};
/* Tx completions per interrupt */ /* Tx completions per interrupt */
struct cdp_hist_tx_comp { struct cdp_hist_tx_comp {
uint32_t pkts_1; uint32_t pkts_1;

View File

@@ -1646,6 +1646,8 @@ dp_hif_update_pipe_callback(struct dp_soc *dp_soc,
QDF_STATUS dp_peer_stats_notify(struct dp_pdev *pdev, struct dp_peer *peer); QDF_STATUS dp_peer_stats_notify(struct dp_pdev *pdev, struct dp_peer *peer);
QDF_STATUS dp_peer_qos_stats_notify(struct dp_pdev *dp_pdev,
struct cdp_rx_stats_ppdu_user *ppdu_user);
#else #else
static inline int dp_wdi_event_unsub(struct cdp_soc_t *soc, uint8_t pdev_id, static inline int dp_wdi_event_unsub(struct cdp_soc_t *soc, uint8_t pdev_id,
wdi_event_subscribe *event_cb_sub_handle, wdi_event_subscribe *event_cb_sub_handle,
@@ -1708,6 +1710,11 @@ static inline QDF_STATUS dp_peer_stats_notify(struct dp_pdev *pdev,
return QDF_STATUS_SUCCESS; return QDF_STATUS_SUCCESS;
} }
QDF_STATUS dp_peer_qos_stats_notify(struct dp_pdev *dp_pdev,
struct cdp_rx_stats_ppdu_user *ppdu_user)
{
return QDF_STATUS_SUCCESS;
}
#endif /* CONFIG_WIN */ #endif /* CONFIG_WIN */
#ifdef VDEV_PEER_PROTOCOL_COUNT #ifdef VDEV_PEER_PROTOCOL_COUNT

View File

@@ -200,6 +200,7 @@ dp_rx_populate_cdp_indication_ppdu_user(struct dp_pdev *pdev,
uint32_t ast_index; uint32_t ast_index;
int i; int i;
struct mon_rx_user_status *rx_user_status; struct mon_rx_user_status *rx_user_status;
struct mon_rx_user_info *rx_user_info;
struct cdp_rx_stats_ppdu_user *rx_stats_peruser; struct cdp_rx_stats_ppdu_user *rx_stats_peruser;
int ru_size; int ru_size;
bool is_data = false; bool is_data = false;
@@ -211,6 +212,7 @@ dp_rx_populate_cdp_indication_ppdu_user(struct dp_pdev *pdev,
return; return;
rx_user_status = &ppdu_info->rx_user_status[i]; rx_user_status = &ppdu_info->rx_user_status[i];
rx_user_info = &ppdu_info->rx_user_info[i];
rx_stats_peruser = &cdp_rx_ppdu->user[i]; rx_stats_peruser = &cdp_rx_ppdu->user[i];
ast_index = rx_user_status->ast_index; ast_index = rx_user_status->ast_index;
@@ -240,6 +242,10 @@ dp_rx_populate_cdp_indication_ppdu_user(struct dp_pdev *pdev,
rx_stats_peruser->frame_control = rx_stats_peruser->frame_control =
rx_user_status->frame_control; rx_user_status->frame_control;
rx_stats_peruser->qos_control_info_valid =
rx_user_info->qos_control_info_valid;
rx_stats_peruser->qos_control =
rx_user_info->qos_control;
rx_stats_peruser->tcp_msdu_count = rx_stats_peruser->tcp_msdu_count =
rx_user_status->tcp_msdu_count; rx_user_status->tcp_msdu_count;
rx_stats_peruser->udp_msdu_count = rx_stats_peruser->udp_msdu_count =
@@ -696,6 +702,7 @@ static void dp_rx_stats_update(struct dp_pdev *pdev,
dp_peer_stats_notify(pdev, peer); dp_peer_stats_notify(pdev, peer);
DP_STATS_UPD(peer, rx.last_rssi, ppdu->rssi); DP_STATS_UPD(peer, rx.last_rssi, ppdu->rssi);
dp_peer_qos_stats_notify(pdev, ppdu_user);
if (peer == pdev->invalid_peer) if (peer == pdev->invalid_peer)
continue; continue;

View File

@@ -4394,6 +4394,33 @@ QDF_STATUS dp_peer_stats_notify(struct dp_pdev *dp_pdev, struct dp_peer *peer)
return QDF_STATUS_SUCCESS; return QDF_STATUS_SUCCESS;
} }
QDF_STATUS dp_peer_qos_stats_notify(struct dp_pdev *dp_pdev,
struct cdp_rx_stats_ppdu_user *ppdu_user)
{
struct cdp_interface_peer_qos_stats qos_stats_intf;
if (ppdu_user->peer_id == HTT_INVALID_PEER) {
qdf_err("Invalid peer id");
return QDF_STATUS_E_FAILURE;
}
qdf_mem_zero(&qos_stats_intf, sizeof(qos_stats_intf));
qdf_mem_copy(qos_stats_intf.peer_mac, ppdu_user->mac_addr,
QDF_MAC_ADDR_SIZE);
qos_stats_intf.frame_control = ppdu_user->frame_control;
qos_stats_intf.frame_control_info_valid =
ppdu_user->frame_control_info_valid;
qos_stats_intf.qos_control = ppdu_user->qos_control;
qos_stats_intf.qos_control_info_valid =
ppdu_user->qos_control_info_valid;
qos_stats_intf.vdev_id = ppdu_user->vdev_id;
dp_wdi_event_handler(WDI_EVENT_PEER_QOS_STATS, dp_pdev->soc,
(void *)&qos_stats_intf, 0,
WDI_NO_VAL, dp_pdev->pdev_id);
return QDF_STATUS_SUCCESS;
}
#endif #endif
#ifdef QCA_ENH_V3_STATS_SUPPORT #ifdef QCA_ENH_V3_STATS_SUPPORT

View File

@@ -270,12 +270,20 @@ hal_rx_populate_byte_count(void *rx_tlv, void *ppduinfo,
#endif #endif
static inline void static inline void
hal_rx_populate_mu_user_info(void *rx_tlv, void *ppduinfo, hal_rx_populate_mu_user_info(void *rx_tlv, void *ppduinfo, uint32_t user_id,
struct mon_rx_user_status *mon_rx_user_status) struct mon_rx_user_status *mon_rx_user_status)
{ {
struct mon_rx_info *mon_rx_info;
struct mon_rx_user_info *mon_rx_user_info;
struct hal_rx_ppdu_info *ppdu_info = struct hal_rx_ppdu_info *ppdu_info =
(struct hal_rx_ppdu_info *)ppduinfo; (struct hal_rx_ppdu_info *)ppduinfo;
mon_rx_info = &ppdu_info->rx_info;
mon_rx_user_info = &ppdu_info->rx_user_info[user_id];
mon_rx_user_info->qos_control_info_valid =
mon_rx_info->qos_control_info_valid;
mon_rx_user_info->qos_control = mon_rx_info->qos_control;
mon_rx_user_status->ast_index = ppdu_info->rx_status.ast_index; mon_rx_user_status->ast_index = ppdu_info->rx_status.ast_index;
mon_rx_user_status->tid = ppdu_info->rx_status.tid; mon_rx_user_status->tid = ppdu_info->rx_status.tid;
mon_rx_user_status->tcp_msdu_count = mon_rx_user_status->tcp_msdu_count =
@@ -310,30 +318,6 @@ hal_rx_populate_mu_user_info(void *rx_tlv, void *ppduinfo,
hal_rx_populate_byte_count(rx_tlv, ppdu_info, mon_rx_user_status); hal_rx_populate_byte_count(rx_tlv, ppdu_info, mon_rx_user_status);
} }
#ifdef WLAN_TX_PKT_CAPTURE_ENH
static inline void
hal_rx_populate_tx_capture_user_info(void *ppduinfo,
uint32_t user_id)
{
struct hal_rx_ppdu_info *ppdu_info;
struct mon_rx_info *mon_rx_info;
struct mon_rx_user_info *mon_rx_user_info;
ppdu_info = (struct hal_rx_ppdu_info *)ppduinfo;
mon_rx_info = &ppdu_info->rx_info;
mon_rx_user_info = &ppdu_info->rx_user_info[user_id];
mon_rx_user_info->qos_control_info_valid =
mon_rx_info->qos_control_info_valid;
mon_rx_user_info->qos_control = mon_rx_info->qos_control;
}
#else
static inline void
hal_rx_populate_tx_capture_user_info(void *ppduinfo,
uint32_t user_id)
{
}
#endif
#define HAL_RX_UPDATE_RSSI_PER_CHAIN_BW(chain, word_1, word_2, \ #define HAL_RX_UPDATE_RSSI_PER_CHAIN_BW(chain, word_1, word_2, \
ppdu_info, rssi_info_tlv) \ ppdu_info, rssi_info_tlv) \
{ \ { \
@@ -740,11 +724,9 @@ hal_rx_status_get_tlv_info_generic(void *rx_tlv_hdr, void *ppduinfo,
ppdu_info->com_info.num_users++; ppdu_info->com_info.num_users++;
hal_rx_populate_mu_user_info(rx_tlv, ppdu_info, hal_rx_populate_mu_user_info(rx_tlv, ppdu_info,
user_id,
mon_rx_user_status); mon_rx_user_status);
hal_rx_populate_tx_capture_user_info(ppdu_info,
user_id);
} }
break; break;
} }