qcacmn: Add WAR to consistently read mgmt Rx REO snapshots
Read the management Rx reorder snapshots back to back to get a consistent value. CRs-Fixed: 3181479 Change-Id: I5ff73db5d4be362d7449494f3630a11da0456f0e
This commit is contained in:
parent
a9b55f2c20
commit
ff6d633d72
@ -1,5 +1,6 @@
|
||||
/*
|
||||
* Copyright (c) 2021, The Linux Foundation. All rights reserved.
|
||||
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
@ -32,7 +33,8 @@
|
||||
|
||||
#ifdef WLAN_MGMT_RX_REO_SUPPORT
|
||||
|
||||
#define MGMT_RX_REO_SNAPSHOT_READ_RETRY_LIMIT (5)
|
||||
#define MGMT_RX_REO_SNAPSHOT_B2B_READ_SWAR_RETRY_LIMIT (4)
|
||||
#define MGMT_RX_REO_SNAPSHOT_READ_RETRY_LIMIT (5)
|
||||
|
||||
/**
|
||||
* target_if_get_mgmt_rx_reo_low_level_ops() - Get low-level ops of management
|
||||
|
@ -224,6 +224,64 @@ target_if_mgmt_rx_reo_get_valid_hw_link_bitmap(struct wlan_objmgr_psoc *psoc,
|
||||
return QDF_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* target_if_mgmt_rx_reo_read_snapshot_raw() - Read raw value of management
|
||||
* rx-reorder snapshot
|
||||
* @snapshot_address: snapshot address
|
||||
* @mgmt_rx_reo_snapshot_low: Pointer to lower 32 bits of snapshot value
|
||||
* @mgmt_rx_reo_snapshot_high: Pointer to higher 32 bits of snapshot value
|
||||
* @snapshot_version: snapshot version
|
||||
*
|
||||
* Read raw value of management rx-reorder snapshots.
|
||||
*
|
||||
* Return: QDF_STATUS
|
||||
*/
|
||||
static QDF_STATUS
|
||||
target_if_mgmt_rx_reo_read_snapshot_raw
|
||||
(struct mgmt_rx_reo_shared_snapshot *snapshot_address,
|
||||
uint32_t *mgmt_rx_reo_snapshot_low,
|
||||
uint32_t *mgmt_rx_reo_snapshot_high,
|
||||
uint8_t snapshot_version)
|
||||
{
|
||||
uint32_t prev_snapshot_low;
|
||||
uint32_t prev_snapshot_high;
|
||||
uint32_t cur_snapshot_low;
|
||||
uint32_t cur_snapshot_high;
|
||||
uint8_t retry_count = 0;
|
||||
|
||||
if (snapshot_version == 1) {
|
||||
*mgmt_rx_reo_snapshot_low =
|
||||
snapshot_address->mgmt_rx_reo_snapshot_low;
|
||||
*mgmt_rx_reo_snapshot_high =
|
||||
snapshot_address->mgmt_rx_reo_snapshot_high;
|
||||
return QDF_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
prev_snapshot_low = snapshot_address->mgmt_rx_reo_snapshot_low;
|
||||
prev_snapshot_high = snapshot_address->mgmt_rx_reo_snapshot_high;
|
||||
|
||||
for (; retry_count < MGMT_RX_REO_SNAPSHOT_B2B_READ_SWAR_RETRY_LIMIT;
|
||||
retry_count++) {
|
||||
cur_snapshot_low = snapshot_address->mgmt_rx_reo_snapshot_low;
|
||||
cur_snapshot_high = snapshot_address->mgmt_rx_reo_snapshot_high;
|
||||
|
||||
if (prev_snapshot_low == cur_snapshot_low &&
|
||||
prev_snapshot_high == cur_snapshot_high)
|
||||
break;
|
||||
|
||||
prev_snapshot_low = cur_snapshot_low;
|
||||
prev_snapshot_high = cur_snapshot_high;
|
||||
}
|
||||
|
||||
qdf_assert_always(retry_count !=
|
||||
MGMT_RX_REO_SNAPSHOT_B2B_READ_SWAR_RETRY_LIMIT);
|
||||
|
||||
*mgmt_rx_reo_snapshot_low = cur_snapshot_low;
|
||||
*mgmt_rx_reo_snapshot_high = cur_snapshot_high;
|
||||
|
||||
return QDF_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* target_if_mgmt_rx_reo_read_snapshot() - Read management rx-reorder snapshot
|
||||
* @pdev: pdev pointer
|
||||
@ -291,10 +349,17 @@ target_if_mgmt_rx_reo_read_snapshot(
|
||||
retry_count = 0;
|
||||
for (; retry_count < MGMT_RX_REO_SNAPSHOT_READ_RETRY_LIMIT;
|
||||
retry_count++) {
|
||||
mgmt_rx_reo_snapshot_low =
|
||||
snapshot_address->mgmt_rx_reo_snapshot_low;
|
||||
mgmt_rx_reo_snapshot_high =
|
||||
snapshot_address->mgmt_rx_reo_snapshot_high;
|
||||
status = target_if_mgmt_rx_reo_read_snapshot_raw
|
||||
(snapshot_address,
|
||||
&mgmt_rx_reo_snapshot_low,
|
||||
&mgmt_rx_reo_snapshot_high,
|
||||
snapshot_version);
|
||||
|
||||
if (QDF_IS_STATUS_ERROR(status)) {
|
||||
mgmt_rx_reo_err("Failed to read snapshot %d",
|
||||
id);
|
||||
return QDF_STATUS_E_FAILURE;
|
||||
}
|
||||
|
||||
snapshot_valid = low_level_ops->snapshot_is_valid(
|
||||
mgmt_rx_reo_snapshot_low,
|
||||
@ -331,8 +396,8 @@ target_if_mgmt_rx_reo_read_snapshot(
|
||||
}
|
||||
|
||||
if (retry_count == MGMT_RX_REO_SNAPSHOT_READ_RETRY_LIMIT) {
|
||||
mgmt_rx_reo_alert("Read retry limit, id = %d, ver = %u",
|
||||
id, snapshot_version);
|
||||
mgmt_rx_reo_err("Read retry limit, id = %d, ver = %u",
|
||||
id, snapshot_version);
|
||||
snapshot_value->valid = false;
|
||||
snapshot_value->mgmt_pkt_ctr = 0xFFFF;
|
||||
snapshot_value->global_timestamp = 0xFFFFFFFF;
|
||||
|
Loading…
Reference in New Issue
Block a user