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:
@@ -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];
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -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;
|
||||||
|
@@ -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
|
||||||
|
@@ -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;
|
||||||
|
|
||||||
|
@@ -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
|
||||||
|
@@ -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;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user