qcacmn: Optimize ppdu_info memory

a. Optimize mon_rx_status and mon_rx_user_status objects memory
b. Add QDF API to remove last element in nbuf queue

Change-Id: I53328aae4d2861e0d2972556f61c8556be5e601c
CRs-Fixed: 3278895
This commit is contained in:
Amir Patel
2022-08-29 19:52:48 +05:30
committed by Madan Koyyalamudi
parent 8983dd04f8
commit 49555350f2
2 changed files with 144 additions and 102 deletions

View File

@@ -251,7 +251,6 @@ typedef __qdf_nbuf_queue_t qdf_nbuf_queue_t;
* htt_rx_desc used later to update radiotap information.
* @tsft: Time Synchronization Function timer
* @ppdu_timestamp: Timestamp in the PPDU_START TLV
* @preamble_type: Preamble type in radio header
* @chan_freq: Capture channel frequency
* @chan_num: Capture channel number
* @chan_flags: Bitmap of Channel flags, IEEE80211_CHAN_TURBO,
@@ -264,8 +263,35 @@ typedef __qdf_nbuf_queue_t qdf_nbuf_queue_t;
* @he_mu_other_flags: HE-MU-OTHER (11ax) flags, only present in HE frames
* @usig_flags: USIG flags, only present in 802.11BE and subsequent protocol
* @eht_flags: EHT (11be) flags, only present in EHT frames
* @he_sig_A1_known: HE (11ax) sig A1 known field
* @he_sig_A2_known: HE (11ax) sig A2 known field
* @nr_ant: Number of Antennas used for streaming
* @mcs: MCS index of Rx frame
* @nss: Number of spatial streams
* @bw: bandwidth of rx frame
* @is_stbc: Is STBC enabled
* @sgi: Rx frame short guard interval
* @he_re: HE range extension
* @ldpc: ldpc enabled
* @beamformed: Is frame beamformed.
* @dcm: dcm
* @preamble_type: Preamble type in radio header
* @tid: QoS traffic tid number
* @rs_fcs_err: FCS error flag
* @cck_flag: Flag to indicate CCK modulation
* @ofdm_flag: Flag to indicate OFDM modulation
* @ulofdma_flag: Flag to indicate UL OFDMA PPDU
* @monitor_direct_used: monitor direct mode
* @data_sequence_control_info_valid: field to indicate validity of seq control
* @rxpcu_filter_pass: Flag which indicates whether RX packets are received in
* BSS mode(not in promisc mode)
* @add_rtap_ext: add radio tap extension
* @frame_control_info_valid: field indicates if fc value is valid
* @add_rtap_ext2: add radiotap extension2
* @reception_type: PPDU reception type
* @ltf_size: ltf size
* @tx_status: packet tx status
* @rx_antenna: rx antenna
* @vht_flag_values6: VHT flag value6
* @he_mu_other_flags: HE MU other flag
* @he_sig_b_common: HE (11ax) sig B common field
* @he_sig_b_common_known: HE (11ax) sig B common known field
* @l_sig_a_info: L_SIG_A value coming in Rx descriptor
@@ -274,29 +300,22 @@ typedef __qdf_nbuf_queue_t qdf_nbuf_queue_t;
* @rate: Rate in terms 500Kbps
* @rtap_flags: Bit map of available fields in the radiotap
* @ant_signal_db: Rx packet RSSI
* @nr_ant: Number of Antennas used for streaming
* @mcs: MCS index of Rx frame
* @ht_mcs: MCS index for HT RX frames
* @nss: Number of spatial streams
* @bw: bandwidth of rx frame
* @is_stbc: Is STBC enabled
* @sgi: Rx frame short guard interval
* @he_re: HE range extension
* @ldpc: ldpc enabled
* @beamformed: Is frame beamformed.
* @tcp_msdu_count: TCP MSDU Count
* @udp_msdu_count: UDP MSDU Count
* @other_msdu_count: Other MSDU Count
* @vht_flag_values1: VHT flag value 1
* @vht_flag_values2: VHT flag value 2
* @vht_flag_values3: VHT flag value 3
* @vht_flag_values4: VHT flag value 4
* @vht_flag_values5: VHT flag value 5
* @he_sig_b_common_RU[4]: HE (11ax) common RU assignment index
* @rssi_comb: Combined RSSI
* @rssi[MAX_CHAIN]: 8 bits RSSI per 20Mhz per chain
* @duration: 802.11 Duration
* @frame_control_info_valid: field indicates if fc value is valid
* @frame_control: frame control field
* @ast_index: AST table hash index
* @tid: QoS traffic tid number
* @rs_fcs_err: FCS error flag
* @rs_flags: Flags to indicate AMPDU or AMSDU aggregation
* @cck_flag: Flag to indicate CCK modulation
* @ofdm_flag: Flag to indicate OFDM modulation
* @ulofdma_flag: Flag to indicate UL OFDMA PPDU
* @he_per_user_1: HE per user info1
* @he_per_user_2: HE per user info2
* @he_per_user_position: HE per user position info
@@ -317,17 +336,11 @@ typedef __qdf_nbuf_queue_t qdf_nbuf_queue_t;
* function.
* @device_id: Device ID coming from sub-system (PCI, AHB etc..)
* @chan_noise_floor: Channel Noise Floor for the pdev
* @data_sequence_control_info_valid: field to indicate validity of seq control
* @first_data_seq_ctrl: Sequence ctrl field of first data frame
* @rxpcu_filter_pass: Flag which indicates whether RX packets are received in
* BSS mode(not in promisc mode)
* @rssi_chain: Rssi chain per nss per bw
* @tx_status: packet tx status
* @tx_retry_cnt: tx retry count
* @add_rtap_ext: add radio tap extension
* @start_seq: starting sequence number
* @ba_bitmap: 256 bit block ack bitmap
* @add_rtap_ext2: add radiotap extension2
* @mpdu_retry_cnt: Rx mpdu retry count
* @punctured_pattern: punctured pattern (0 means the band is punctured)
* @rx_user_status: pointer to mon_rx_user_status, when set update
@@ -353,7 +366,6 @@ typedef __qdf_nbuf_queue_t qdf_nbuf_queue_t;
* @aggregation: Indicate A-MPDU format
* @ht_stbc: Indicate stbc
* @ht_crc: ht crc
* @dcm: dcm
* @xlna_bypass_offset: Low noise amplifier bypass offset
* @xlna_bypass_threshold: Low noise amplifier bypass threshold
* @rssi_temp_offset: Temperature based rssi offset
@@ -364,20 +376,43 @@ typedef __qdf_nbuf_queue_t qdf_nbuf_queue_t;
struct mon_rx_status {
uint64_t tsft;
uint32_t ppdu_timestamp;
uint32_t preamble_type;
qdf_freq_t chan_freq;
uint16_t chan_num;
uint16_t chan_flags;
uint16_t ht_flags;
uint16_t vht_flags;
uint16_t ht_flags : 1,
vht_flags : 1,
he_flags : 1,
he_mu_flags : 1,
usig_flags : 1,
eht_flags : 1,
nr_ant : 3,
mcs : 4,
nss : 3,
bw : 4,
is_stbc : 1,
sgi : 1,
he_re : 1,
ldpc : 1,
beamformed : 1,
dcm : 1,
preamble_type : 4;
uint32_t tid : 5,
rs_fcs_err : 1,
cck_flag : 1,
ofdm_flag : 1,
ulofdma_flag : 1,
monitor_direct_used : 1,
data_sequence_control_info_valid : 1,
rxpcu_filter_pass : 1,
add_rtap_ext : 1,
frame_control_info_valid : 1,
add_rtap_ext2 : 1,
reception_type : 4,
ltf_size : 2,
tx_status : 4;
uint32_t rx_antenna : 24;
uint16_t vht_flag_values6;
uint16_t he_flags;
uint16_t he_mu_flags;
uint16_t he_mu_other_flags;
uint16_t usig_flags;
uint16_t eht_flags;
uint16_t he_sig_A1_known;
uint16_t he_sig_A2_known;
uint16_t he_sig_b_common;
uint16_t he_sig_b_common_known;
uint32_t l_sig_a_info;
@@ -386,38 +421,22 @@ struct mon_rx_status {
uint8_t rate;
uint8_t rtap_flags;
uint8_t ant_signal_db;
uint8_t nr_ant;
uint8_t mcs;
uint8_t ht_mcs;
uint8_t nss;
uint16_t tcp_msdu_count;
uint16_t udp_msdu_count;
uint16_t other_msdu_count;
uint8_t bw;
uint8_t vht_flag_values1;
uint8_t vht_flag_values2;
uint8_t vht_flag_values3[4];
uint8_t vht_flag_values4;
uint8_t vht_flag_values5;
uint8_t is_stbc;
uint8_t sgi;
uint8_t he_re;
uint8_t ldpc;
uint8_t beamformed;
uint8_t he_sig_b_common_RU[4];
int8_t rssi_comb;
uint64_t rssi[MAX_CHAIN];
uint8_t reception_type;
int8_t rssi[MAX_CHAIN];
uint16_t duration;
uint8_t frame_control_info_valid;
uint16_t frame_control;
uint32_t ast_index;
uint32_t tid;
uint8_t rs_fcs_err;
uint16_t ast_index;
uint8_t rs_flags;
uint8_t cck_flag;
uint8_t ofdm_flag;
uint8_t ulofdma_flag;
/* New HE radiotap fields */
uint16_t he_per_user_1;
uint16_t he_per_user_2;
@@ -433,24 +452,16 @@ struct mon_rx_status {
uint16_t he_data5;
uint16_t he_data6;
uint32_t ppdu_len;
uint32_t prev_ppdu_id;
uint32_t ppdu_id;
uint32_t device_id;
uint16_t prev_ppdu_id;
uint16_t ppdu_id;
uint16_t device_id;
int16_t chan_noise_floor;
uint8_t monitor_direct_used;
uint8_t data_sequence_control_info_valid;
uint16_t first_data_seq_ctrl;
uint8_t ltf_size;
uint8_t rxpcu_filter_pass;
int8_t rssi_chain[8][8];
uint32_t rx_antenna;
uint8_t tx_status;
uint8_t tx_retry_cnt;
bool add_rtap_ext;
uint16_t start_seq;
uint32_t ba_bitmap[8];
bool add_rtap_ext2;
uint32_t mpdu_retry_cnt;
uint16_t mpdu_retry_cnt;
#ifdef WLAN_FEATURE_11BE
uint16_t punctured_pattern;
#endif
@@ -468,17 +479,16 @@ struct mon_rx_status {
vht_no_txop_ps:1,
he_crc:4;
uint32_t l_sig_length:12,
l_sig_a_parity:1,
l_sig_a_pkt_type:4,
l_sig_a_implicit_sounding:1;
l_sig_a_parity:1,
l_sig_a_pkt_type:4,
l_sig_a_implicit_sounding:1;
uint32_t ht_length:16,
smoothing:1,
not_sounding:1,
aggregation:1,
ht_stbc:2,
ht_crc:8;
smoothing:1,
not_sounding:1,
aggregation:1,
ht_stbc:2,
ht_crc:8;
#endif
uint8_t dcm;
#ifdef QCA_RSSI_DB2DBM
int32_t xlna_bypass_offset;
int32_t xlna_bypass_threshold;
@@ -502,20 +512,22 @@ struct mon_rx_status {
* @mu_ul_user_v0_word0: MU UL user info word 0
* @mu_ul_user_v0_word1: MU UL user info word 1
* @ast_index: AST table hash index
* @sw_peer_id: software peer id
* @tid: QoS traffic tid number
* @preamble_type: Preamble type in radio header
* @ht_flags: HT flags, only present for HT frames.
* @vht_flags: VHT flags, only present for VHT frames.
* @he_flags: HE (11ax) flags, only present in HE frames
* @frame_control_info_valid: field indicates if fc value is valid
* @frame_control: frame control field
* @data_sequence_control_info_valid: field to indicate validity of seq control
* @filter_category: mpdu filter category
* @tcp_msdu_count: tcp protocol msdu count
* @udp_msdu_count: udp protocol msdu count
* @other_msdu_count: other protocol msdu count
* @frame_control: frame control field
* @frame_control_info_valid: field indicates if fc value is valid
* @data_sequence_control_info_valid: field to indicate validity of seq control
* @first_data_seq_ctrl: Sequence ctrl field of first data frame
* @preamble_type: Preamble type in radio header
* @duration: 802.11 Duration
* @ht_flags: HT flags, only present for HT frames.
* @vht_flags: VHT flags, only present for VHT frames.
* @vht_flag_values1-5: Contains corresponding data for flags field
* @he_flags: HE (11ax) flags, only present in HE frames
* @he_flags1: HE flags
* @he_flags2: HE flags
* @he_RU[4]: HE RU assignment index
@@ -536,13 +548,11 @@ struct mon_rx_status {
* @mpdu_fcs_ok_bitmap: mpdu with fcs ok bitmap
* @mpdu_ok_byte_count: mpdu byte count with fcs ok
* @mpdu_err_byte_count: mpdu byte count with fcs err
* @sw_peer_id: software peer id
* @retry_mpdu: mpdu retry count
* @start_seq: starting sequence number
* @ba_control: Block ack control
* @ba_bitmap: 256 bit block ack bitmap
* @tid: QoS traffic tid number
* @filter_category: mpdu filter category
* @aid: Association ID
* @mpdu_q: user mpdu_queue used for monitor
*/
struct mon_rx_user_status {
@@ -555,26 +565,28 @@ struct mon_rx_user_status {
is_ampdu:1;
uint32_t mu_ul_user_v0_word0;
uint32_t mu_ul_user_v0_word1;
uint32_t ast_index;
uint32_t tid;
uint32_t ast_index : 16,
sw_peer_id : 16;
uint32_t tid : 4,
preamble_type : 4,
ht_flags : 1,
vht_flags : 1,
he_flags : 1,
frame_control_info_valid : 1,
frame_control : 16,
data_sequence_control_info_valid : 1,
ba_bitmap_sz : 2,
filter_category : 2;
uint16_t tcp_msdu_count;
uint16_t udp_msdu_count;
uint16_t other_msdu_count;
uint16_t frame_control;
uint8_t frame_control_info_valid;
uint8_t data_sequence_control_info_valid;
uint16_t first_data_seq_ctrl;
uint32_t preamble_type;
uint16_t duration;
uint16_t ht_flags;
uint16_t vht_flags;
uint8_t vht_flag_values1;
uint8_t vht_flag_values2;
uint8_t vht_flag_values3[4];
uint8_t vht_flag_values4;
uint8_t vht_flag_values5;
uint16_t vht_flag_values6;
uint16_t he_flags;
uint16_t he_flags1;
uint16_t he_flags2;
uint8_t he_RU[4];
@@ -584,25 +596,22 @@ struct mon_rx_user_status {
uint16_t he_data4;
uint16_t he_data5;
uint16_t he_data6;
uint16_t he_per_user_1;
uint16_t he_per_user_2;
uint8_t he_per_user_1;
uint8_t he_per_user_2;
uint8_t he_per_user_position;
uint8_t he_per_user_known;
uint8_t rtap_flags;
uint8_t rs_flags;
uint32_t mpdu_cnt_fcs_ok;
uint32_t mpdu_cnt_fcs_err;
uint16_t mpdu_cnt_fcs_ok;
uint8_t mpdu_cnt_fcs_err;
uint32_t mpdu_fcs_ok_bitmap[QDF_MON_STATUS_MPDU_FCS_BMAP_NWORDS];
uint32_t mpdu_ok_byte_count;
uint32_t mpdu_err_byte_count;
uint16_t sw_peer_id;
uint32_t retry_mpdu;
uint16_t retry_mpdu;
uint16_t start_seq;
uint16_t ba_control;
uint32_t ba_bitmap[32];
uint32_t ba_bitmap_sz;
uint32_t ba_bitmap[8];
uint16_t aid;
uint8_t filter_category;
qdf_nbuf_queue_t mpdu_q;
};
@@ -2694,6 +2703,17 @@ qdf_nbuf_queue_insert_head(qdf_nbuf_queue_t *head, qdf_nbuf_t buf)
__qdf_nbuf_queue_insert_head(head, buf);
}
/**
* qdf_nbuf_queue_remove_last() - remove last nbuf from queue
* @head: Network buf queue head
*
* Return: none
*/
static inline qdf_nbuf_t qdf_nbuf_queue_remove_last(qdf_nbuf_queue_t *head)
{
return __qdf_nbuf_queue_remove_last(head);
}
/**
* qdf_nbuf_queue_remove() - retrieve a buf from the head of the buf queue
* @head: Network buf queue head

View File

@@ -1774,6 +1774,28 @@ __qdf_nbuf_queue_insert_head(__qdf_nbuf_queue_t *qhead, __qdf_nbuf_t skb)
qhead->qlen++;
}
static inline struct sk_buff *
__qdf_nbuf_queue_remove_last(__qdf_nbuf_queue_t *qhead)
{
__qdf_nbuf_t tmp_tail, node = NULL;
if (qhead->head) {
tmp_tail = qhead->tail;
node = qhead->head;
if (qhead->head == qhead->tail) {
qhead->head = NULL;
qhead->tail = NULL;
return node;
} else {
while (tmp_tail != node->next)
node = node->next;
qhead->tail = node;
return node->next;
}
}
return node;
}
/**
* __qdf_nbuf_queue_remove() - remove a skb from the head of the queue
* @qhead: Queue head