qcacmn: Handle ingress reo list overflow
Handle overflow of management Rx reorder ingress list. CRs-Fixed: 3402355 Change-Id: I2e7ab5b672e6cb2db2cb1e47d3854ad55d6b540a
This commit is contained in:

کامیت شده توسط
Madan Koyyalamudi

والد
52c0ba9a7a
کامیت
0571d2f7bf
@@ -2432,6 +2432,9 @@ mgmt_rx_reo_move_entries_ingress_to_egress_list
|
||||
struct mgmt_rx_reo_list_entry *ingress_list_entry;
|
||||
struct mgmt_rx_reo_list_entry *latest_frame_ready_to_deliver = NULL;
|
||||
uint16_t num_frames_ready_to_deliver = 0;
|
||||
uint32_t num_overflow_frames = 0;
|
||||
uint32_t ingress_list_max_size;
|
||||
uint32_t ingress_list_cur_size;
|
||||
|
||||
if (!ingress_list) {
|
||||
mgmt_rx_reo_err("Ingress list is null");
|
||||
@@ -2447,7 +2450,19 @@ mgmt_rx_reo_move_entries_ingress_to_egress_list
|
||||
|
||||
qdf_spin_lock_bh(&reo_ingress_list->list_lock);
|
||||
|
||||
ingress_list_cur_size = qdf_list_size(&reo_ingress_list->list);
|
||||
ingress_list_max_size = reo_ingress_list->max_list_size;
|
||||
if (mgmt_rx_reo_list_overflowed(reo_ingress_list))
|
||||
num_overflow_frames =
|
||||
ingress_list_cur_size - ingress_list_max_size;
|
||||
|
||||
qdf_list_for_each(&reo_ingress_list->list, ingress_list_entry, node) {
|
||||
if (num_overflow_frames > 0) {
|
||||
ingress_list_entry->status |=
|
||||
STATUS_INGRESS_LIST_OVERFLOW;
|
||||
num_overflow_frames--;
|
||||
}
|
||||
|
||||
if (!mgmt_rx_reo_is_entry_ready_to_send_up(ingress_list_entry))
|
||||
break;
|
||||
|
||||
@@ -2480,6 +2495,8 @@ mgmt_rx_reo_move_entries_ingress_to_egress_list
|
||||
&temp_list_frames_ready_to_deliver);
|
||||
qdf_assert_always(QDF_IS_STATUS_SUCCESS(status));
|
||||
|
||||
qdf_assert_always(qdf_list_size(&reo_ingress_list->list) <=
|
||||
reo_ingress_list->max_list_size);
|
||||
qdf_assert_always(qdf_list_size(&reo_egress_list->list) <=
|
||||
reo_egress_list->max_list_size);
|
||||
|
||||
@@ -2891,8 +2908,15 @@ mgmt_rx_reo_update_ingress_list(struct mgmt_rx_reo_ingress_list *ingress_list,
|
||||
frame_desc->queued_list = MGMT_RX_REO_LIST_TYPE_INGRESS;
|
||||
|
||||
overflow = (qdf_list_size(&reo_ingress_list->list) >
|
||||
reo_ingress_list->max_list_size);
|
||||
qdf_assert_always(!overflow);
|
||||
reo_ingress_list->max_list_size);
|
||||
if (overflow) {
|
||||
qdf_list_t *ingress_list_ptr = &reo_ingress_list->list;
|
||||
|
||||
reo_ingress_list->overflow_count++;
|
||||
mgmt_rx_reo_err_rl("Ingress overflow, cnt:%llu size:%u",
|
||||
reo_ingress_list->overflow_count,
|
||||
qdf_list_size(ingress_list_ptr));
|
||||
}
|
||||
|
||||
if (new->wait_count.total_count == 0)
|
||||
frame_desc->zero_wait_count_rx = true;
|
||||
|
@@ -36,9 +36,9 @@
|
||||
#include <wlan_objmgr_psoc_obj.h>
|
||||
#include <wlan_mlo_mgr_public_structs.h>
|
||||
|
||||
#define MGMT_RX_REO_INGRESS_LIST_MAX_SIZE (256)
|
||||
#define MGMT_RX_REO_INGRESS_LIST_TIMEOUT_US (500 * USEC_PER_MSEC)
|
||||
#define MGMT_RX_REO_INGRESS_LIST_AGEOUT_TIMER_PERIOD_MS (250)
|
||||
#define MGMT_RX_REO_INGRESS_LIST_MAX_SIZE (512)
|
||||
#define MGMT_RX_REO_INGRESS_LIST_TIMEOUT_US (250 * USEC_PER_MSEC)
|
||||
#define MGMT_RX_REO_INGRESS_LIST_AGEOUT_TIMER_PERIOD_MS (50)
|
||||
|
||||
#define MGMT_RX_REO_EGRESS_LIST_MAX_SIZE (256)
|
||||
|
||||
@@ -246,6 +246,7 @@ struct mgmt_rx_reo_frame_info {
|
||||
* @list: Linked list
|
||||
* @list_lock: Spin lock to protect the list
|
||||
* @max_list_size: Maximum size of the reorder list
|
||||
* @overflow_count: Number of times list overflow occurred
|
||||
* @last_inserted_frame: Information about the last frame inserted to the list
|
||||
* @last_released_frame: Information about the last frame released from the list
|
||||
*/
|
||||
@@ -253,6 +254,7 @@ struct mgmt_rx_reo_list {
|
||||
qdf_list_t list;
|
||||
qdf_spinlock_t list_lock;
|
||||
uint32_t max_list_size;
|
||||
uint64_t overflow_count;
|
||||
struct mgmt_rx_reo_frame_info last_inserted_frame;
|
||||
struct mgmt_rx_reo_frame_info last_released_frame;
|
||||
};
|
||||
@@ -847,6 +849,21 @@ struct mgmt_rx_reo_frame_descriptor {
|
||||
struct mgmt_rx_reo_frame_info last_delivered_frame;
|
||||
};
|
||||
|
||||
/**
|
||||
* mgmt_rx_reo_list_overflowed() - Helper API to check whether mgmt rx reorder
|
||||
* list overflowed
|
||||
* @reo_list: Pointer to management rx reorder list
|
||||
*
|
||||
* Return: true or false
|
||||
*/
|
||||
static inline bool
|
||||
mgmt_rx_reo_list_overflowed(struct mgmt_rx_reo_list *reo_list)
|
||||
{
|
||||
qdf_assert_always(reo_list);
|
||||
|
||||
return (qdf_list_size(&reo_list->list) > reo_list->max_list_size);
|
||||
}
|
||||
|
||||
/**
|
||||
* mgmt_rx_reo_get_context_from_ingress_list() - Helper API to get pointer to
|
||||
* management rx reorder context from pointer to management rx reo ingress list
|
||||
|
مرجع در شماره جدید
Block a user