qcacmn: Check the sanity of mgmt Rx REO snapshots

Ensure the sanity of management Rx reorder snapshots of each valid
link.

CRs-Fixed: 3182800
Change-Id: I5949c8a7f8b15cb6a3eac874694daebb39423624
Šī revīzija ir iekļauta:
Edayilliam Jayadev
2022-04-27 16:23:04 +05:30
revīziju iesūtīja Madan Koyyalamudi
vecāks f9969cdc06
revīzija 97e2f4b060

Parādīt failu

@@ -653,6 +653,181 @@ wlan_mgmt_rx_reo_get_priv_object(struct wlan_objmgr_pdev *pdev)
return mgmt_txrx_pdev_ctx->mgmt_rx_reo_pdev_ctx;
}
/**
* mgmt_rx_reo_snapshots_check_sanity() - Check the sanity of management
* Rx REO snapshots
* @mac_hw_ss: MAC HW snapshot
* @fw_forwarded_ss: FW forwarded snapshot
* @fw_consumed_ss: FW consumed snapshot
* @host_ss: Host snapshot
*
* return: QDF_STATUS
*/
static QDF_STATUS
mgmt_rx_reo_snapshots_check_sanity
(struct mgmt_rx_reo_snapshot_params *mac_hw_ss,
struct mgmt_rx_reo_snapshot_params *fw_forwarded_ss,
struct mgmt_rx_reo_snapshot_params *fw_consumed_ss,
struct mgmt_rx_reo_snapshot_params *host_ss)
{
QDF_STATUS status;
if (!mac_hw_ss->valid) {
if (fw_forwarded_ss->valid || fw_consumed_ss->valid ||
host_ss->valid) {
mgmt_rx_reo_err("MAC HW SS is invalid");
status = QDF_STATUS_E_INVAL;
goto fail;
}
return QDF_STATUS_SUCCESS;
}
if (!fw_forwarded_ss->valid && !fw_consumed_ss->valid) {
if (host_ss->valid) {
mgmt_rx_reo_err("FW forwarded and consumed SS invalid");
status = QDF_STATUS_E_INVAL;
goto fail;
}
return QDF_STATUS_SUCCESS;
}
if (fw_forwarded_ss->valid) {
if (!mgmt_rx_reo_compare_global_timestamps_gte
(mac_hw_ss->global_timestamp,
fw_forwarded_ss->global_timestamp)) {
mgmt_rx_reo_err("MAC HW SS < FW forwarded SS");
status = QDF_STATUS_E_INVAL;
goto fail;
}
if (!mgmt_rx_reo_compare_pkt_ctrs_gte
(mac_hw_ss->mgmt_pkt_ctr,
fw_forwarded_ss->mgmt_pkt_ctr)) {
mgmt_rx_reo_err("MAC HW SS < FW forwarded SS");
status = QDF_STATUS_E_INVAL;
goto fail;
}
}
if (fw_consumed_ss->valid) {
if (!mgmt_rx_reo_compare_global_timestamps_gte
(mac_hw_ss->global_timestamp,
fw_consumed_ss->global_timestamp)) {
mgmt_rx_reo_err("MAC HW SS < FW consumed SS");
status = QDF_STATUS_E_INVAL;
goto fail;
}
if (!mgmt_rx_reo_compare_pkt_ctrs_gte
(mac_hw_ss->mgmt_pkt_ctr,
fw_consumed_ss->mgmt_pkt_ctr)) {
mgmt_rx_reo_err("MAC HW SS < FW consumed SS");
status = QDF_STATUS_E_INVAL;
goto fail;
}
}
if (host_ss->valid) {
if (!mgmt_rx_reo_compare_global_timestamps_gte
(mac_hw_ss->global_timestamp,
host_ss->global_timestamp)) {
mgmt_rx_reo_err("MAC HW SS < host SS");
status = QDF_STATUS_E_INVAL;
goto fail;
}
if (!mgmt_rx_reo_compare_pkt_ctrs_gte
(mac_hw_ss->mgmt_pkt_ctr,
host_ss->mgmt_pkt_ctr)) {
mgmt_rx_reo_err("MAC HW SS < host SS");
status = QDF_STATUS_E_INVAL;
goto fail;
}
if (fw_forwarded_ss->valid && !fw_consumed_ss->valid) {
if (!mgmt_rx_reo_compare_global_timestamps_gte
(fw_forwarded_ss->global_timestamp,
host_ss->global_timestamp)) {
mgmt_rx_reo_err("FW forwarded < host SS");
status = QDF_STATUS_E_INVAL;
goto fail;
}
if (!mgmt_rx_reo_compare_pkt_ctrs_gte
(fw_forwarded_ss->mgmt_pkt_ctr,
host_ss->mgmt_pkt_ctr)) {
mgmt_rx_reo_err("FW forwarded < host SS");
status = QDF_STATUS_E_INVAL;
goto fail;
}
}
if (fw_consumed_ss->valid && !fw_forwarded_ss->valid) {
if (!mgmt_rx_reo_compare_global_timestamps_gte
(fw_consumed_ss->global_timestamp,
host_ss->global_timestamp)) {
mgmt_rx_reo_err("FW consumed < host SS");
status = QDF_STATUS_E_INVAL;
goto fail;
}
if (!mgmt_rx_reo_compare_pkt_ctrs_gte
(fw_consumed_ss->mgmt_pkt_ctr,
host_ss->mgmt_pkt_ctr)) {
mgmt_rx_reo_err("FW consumed < host SS");
status = QDF_STATUS_E_INVAL;
goto fail;
}
}
if (fw_forwarded_ss->valid && fw_consumed_ss->valid) {
if (!mgmt_rx_reo_compare_global_timestamps_gte
(fw_consumed_ss->global_timestamp,
host_ss->global_timestamp) &&
!mgmt_rx_reo_compare_global_timestamps_gte
(fw_forwarded_ss->global_timestamp,
host_ss->global_timestamp)) {
mgmt_rx_reo_err("FW consumed/forwarded < host");
status = QDF_STATUS_E_INVAL;
goto fail;
}
if (!mgmt_rx_reo_compare_pkt_ctrs_gte
(fw_consumed_ss->mgmt_pkt_ctr,
host_ss->mgmt_pkt_ctr) &&
!mgmt_rx_reo_compare_pkt_ctrs_gte
(fw_forwarded_ss->mgmt_pkt_ctr,
host_ss->mgmt_pkt_ctr)) {
mgmt_rx_reo_err("FW consumed/forwarded < host");
status = QDF_STATUS_E_INVAL;
goto fail;
}
}
}
return QDF_STATUS_SUCCESS;
fail:
mgmt_rx_reo_err("HW SS: valid = %u, ctr = %u, ts = %u",
mac_hw_ss->valid, mac_hw_ss->mgmt_pkt_ctr,
mac_hw_ss->global_timestamp);
mgmt_rx_reo_err("FW forwarded SS: valid = %u, ctr = %u, ts = %u",
fw_forwarded_ss->valid,
fw_forwarded_ss->mgmt_pkt_ctr,
fw_forwarded_ss->global_timestamp);
mgmt_rx_reo_err("FW consumed SS: valid = %u, ctr = %u, ts = %u",
fw_consumed_ss->valid,
fw_consumed_ss->mgmt_pkt_ctr,
fw_consumed_ss->global_timestamp);
mgmt_rx_reo_err("HOST SS: valid = %u, ctr = %u, ts = %u",
host_ss->valid, host_ss->mgmt_pkt_ctr,
host_ss->global_timestamp);
return status;
}
/**
* wlan_mgmt_rx_reo_algo_calculate_wait_count() - Calculates the number of
* frames an incoming frame should wait for before it gets delivered.
@@ -791,6 +966,14 @@ wlan_mgmt_rx_reo_algo_calculate_wait_count(
fw_consumed_ss = &snapshot_params
[MGMT_RX_REO_SHARED_SNAPSHOT_FW_CONSUMED];
status = mgmt_rx_reo_snapshots_check_sanity
(mac_hw_ss, fw_forwarded_ss, fw_consumed_ss, host_ss);
if (QDF_IS_STATUS_ERROR(status)) {
mgmt_rx_reo_err("Snapshot sanity for link %u failed",
link);
qdf_assert_always(0);
}
mgmt_rx_reo_debug("link_id = %u HW SS: valid = %u, ctr = %u, ts = %u",
link, mac_hw_ss->valid,
mac_hw_ss->mgmt_pkt_ctr,