Jelajahi Sumber

qcacld-3.0: Enhance iw set bitrate command support

Enhance iw set bitrate command implementation to
support legacy mode.

Change-Id: Ic9e5e92ebd57a08217dfaf6a947c5d9dc7839e85
CRs-Fixed: 3557679
Asutosh Mohapatra 1 tahun lalu
induk
melakukan
a7155b7d92
1 mengubah file dengan 56 tambahan dan 1 penghapusan
  1. 56 1
      core/hdd/src/wlan_hdd_cfg80211.c

+ 56 - 1
core/hdd/src/wlan_hdd_cfg80211.c

@@ -455,6 +455,46 @@ static struct ieee80211_supported_band wlan_hdd_band_5_ghz = {
 	.vht_cap.vht_supported = 1,
 };
 
+enum hdd_hw_rate_cck {
+	HDD_HW_RATE_CCK_LP_11M = 0,
+	HDD_HW_RATE_CCK_LP_5_5M,
+	HDD_HW_RATE_CCK_LP_2M,
+	HDD_HW_RATE_CCK_LP_1M,
+	HDD_HW_RATE_CCK_SP_11M,
+	HDD_HW_RATE_CCK_SP_5_5M,
+	HDD_HW_RATE_CCK_SP_2M,
+};
+
+enum hdd_hw_rate_ofdm {
+	HDD_HW_RATE_OFDM_48M = 0,
+	HDD_HW_RATE_OFDM_24M,
+	HDD_HW_RATE_OFDM_12M,
+	HDD_HW_RATE_OFDM_6M,
+	HDD_HW_RATE_OFDM_54M,
+	HDD_HW_RATE_OFDM_36M,
+	HDD_HW_RATE_OFDM_18M,
+	HDD_HW_RATE_OFDM_9M,
+};
+
+static struct ieee80211_rate hdd_legacy_rates[] = {
+	{ .bitrate = 10,
+	  .hw_value = HDD_HW_RATE_CCK_LP_1M },
+	{ .bitrate = 20,
+	  .hw_value = HDD_HW_RATE_CCK_LP_2M },
+	{ .bitrate = 55,
+	  .hw_value = HDD_HW_RATE_CCK_LP_5_5M },
+	{ .bitrate = 110,
+	  .hw_value = HDD_HW_RATE_CCK_LP_11M },
+	{ .bitrate = 60, .hw_value = HDD_HW_RATE_OFDM_6M },
+	{ .bitrate = 90, .hw_value = HDD_HW_RATE_OFDM_9M },
+	{ .bitrate = 120, .hw_value = HDD_HW_RATE_OFDM_12M },
+	{ .bitrate = 180, .hw_value = HDD_HW_RATE_OFDM_18M },
+	{ .bitrate = 240, .hw_value = HDD_HW_RATE_OFDM_24M },
+	{ .bitrate = 360, .hw_value = HDD_HW_RATE_OFDM_36M },
+	{ .bitrate = 480, .hw_value = HDD_HW_RATE_OFDM_48M },
+	{ .bitrate = 540, .hw_value = HDD_HW_RATE_OFDM_54M },
+};
+
 #if defined(CONFIG_BAND_6GHZ) && (defined(CFG80211_6GHZ_BAND_SUPPORTED) || \
 	(KERNEL_VERSION(5, 4, 0) <= LINUX_VERSION_CODE))
 
@@ -27966,7 +28006,7 @@ static int __wlan_hdd_cfg80211_set_bitrate_mask(struct wiphy *wiphy,
 			continue;
 		}
 
-		if (!hweight32(mask->control[band].legacy)) {
+		if (!qdf_get_hweight32(mask->control[band].legacy)) {
 			hdd_err("Legacy bit rate setting not supported for band %u",
 				band);
 			errno = -EINVAL;
@@ -28001,6 +28041,21 @@ static int __wlan_hdd_cfg80211_set_bitrate_mask(struct wiphy *wiphy,
 			}
 		}
 
+		if (qdf_get_hweight32(mask->control[band].legacy) == 1) {
+			rate_index = (ffs(mask->control[band].legacy) - 1);
+			nss = 0;
+			if (band == NL80211_BAND_5GHZ)
+				rate_index += 4;
+			if (rate_index >= 0 && rate_index < 4)
+				bit_rate = hdd_assemble_rate_code(
+					WMI_RATE_PREAMBLE_CCK, nss,
+					hdd_legacy_rates[rate_index].hw_value);
+			else if (rate_index >= 4 && rate_index < 12)
+				bit_rate = hdd_assemble_rate_code(
+					WMI_RATE_PREAMBLE_OFDM, nss,
+					hdd_legacy_rates[rate_index].hw_value);
+		}
+
 		hdd_get_he_bitrate_params_for_band(band, mask, &nss,
 						   &rate_index, &bit_rate);