Просмотр исходного кода

qcacld-3.0: Update the rate flags

assoc_ind->ch_width is updated in function lim_fill_assoc_ind_he_bw_info,
but assoc_ind->chan_info.rate_flags is not updated. It causes BW out of sync
between these two variables.

To resolve this issue, update assoc_ind->chan_info.rate_flags accordingly
at same time.

Change-Id: Ifab85d7ced977f3a3f032853f37dfcdeadb8db26
CRs-Fixed: 3196799
Paul Zhang 2 лет назад
Родитель
Сommit
6a9df0ccbd
1 измененных файлов с 49 добавлено и 0 удалено
  1. 49 0
      core/mac/src/pe/lim/lim_process_assoc_req_frame.c

+ 49 - 0
core/mac/src/pe/lim/lim_process_assoc_req_frame.c

@@ -2997,6 +2997,52 @@ lim_convert_channel_width_enum(enum phy_ch_width ch_width)
 	return eHT_CHANNEL_WIDTH_20MHZ;
 }
 
+/**
+ * lim_convert_rate_flags_enum() - map between channel width and rate flag enums
+ * @rate_flags: the current rate flags
+ * @ch_width: channel width of enum type phy_ch_width
+ *
+ * Return: updated rate flags per ch width
+ */
+static uint32_t lim_convert_rate_flags_enum(uint32_t rate_flags,
+					    enum phy_ch_width ch_width)
+{
+	if (rate_flags & (TX_RATE_VHT160 |
+			  TX_RATE_VHT80 |
+			  TX_RATE_VHT40 |
+			  TX_RATE_VHT20)) {
+		switch (ch_width) {
+		case CH_WIDTH_20MHZ:
+			rate_flags |= TX_RATE_VHT20;
+			break;
+		case CH_WIDTH_40MHZ:
+			rate_flags |= TX_RATE_VHT40;
+			break;
+		case CH_WIDTH_80MHZ:
+			rate_flags |= TX_RATE_VHT80;
+			break;
+		case CH_WIDTH_160MHZ:
+		case CH_WIDTH_80P80MHZ:
+			rate_flags |= TX_RATE_VHT160;
+			break;
+		default:
+			break;
+		}
+	} else {
+		switch (ch_width) {
+		case CH_WIDTH_20MHZ:
+			rate_flags |= TX_RATE_HT20;
+			break;
+		case CH_WIDTH_40MHZ:
+			rate_flags |= TX_RATE_HT40;
+			break;
+		default:
+			break;
+		}
+	}
+	return rate_flags;
+}
+
 static void lim_fill_assoc_ind_he_bw_info(tpLimMlmAssocInd assoc_ind,
 					  tpDphHashNode sta_ds,
 					  struct pe_session *session_entry)
@@ -3005,6 +3051,9 @@ static void lim_fill_assoc_ind_he_bw_info(tpLimMlmAssocInd assoc_ind,
 	    lim_is_session_he_capable(session_entry)) {
 		assoc_ind->ch_width =
 			lim_convert_channel_width_enum(sta_ds->ch_width);
+		assoc_ind->chan_info.rate_flags =
+		    lim_convert_rate_flags_enum(assoc_ind->chan_info.rate_flags,
+						sta_ds->ch_width);
 	}
 }