فهرست منبع

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
Amir Patel 2 سال پیش
والد
کامیت
49555350f2
2فایلهای تغییر یافته به همراه144 افزوده شده و 102 حذف شده
  1. 122 102
      qdf/inc/qdf_nbuf.h
  2. 22 0
      qdf/linux/src/i_qdf_nbuf.h

+ 122 - 102
qdf/inc/qdf_nbuf.h

@@ -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,19 +263,8 @@ 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
- * @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
- * @l_sig_b_info: L_SIG_B value coming in Rx descriptor
- * @num_eht_user_info_valid: Number of valid EHT user info
- * @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
@@ -284,19 +272,50 @@ typedef __qdf_nbuf_queue_t qdf_nbuf_queue_t;
  * @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
+ * @l_sig_b_info: L_SIG_B value coming in Rx descriptor
+ * @num_eht_user_info_valid: Number of valid EHT user info
+ * @rate: Rate in terms 500Kbps
+ * @rtap_flags: Bit map of available fields in the radiotap
+ * @ant_signal_db: Rx packet RSSI
+ * @ht_mcs: MCS index for HT RX frames
+ * @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

+ 22 - 0
qdf/linux/src/i_qdf_nbuf.h

@@ -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