summaryrefslogtreecommitdiff
path: root/wifi
diff options
context:
space:
mode:
Diffstat (limited to 'wifi')
-rw-r--r--wifi/1.6/default/hidl_struct_util.cpp65
-rw-r--r--wifi/1.6/default/hidl_struct_util.h3
-rw-r--r--wifi/1.6/default/wifi_chip.cpp32
-rw-r--r--wifi/1.6/default/wifi_chip.h2
-rw-r--r--wifi/1.6/default/wifi_legacy_hal.cpp12
-rw-r--r--wifi/1.6/default/wifi_legacy_hal.h7
-rw-r--r--wifi/1.6/default/wifi_legacy_hal_stubs.cpp1
7 files changed, 122 insertions, 0 deletions
diff --git a/wifi/1.6/default/hidl_struct_util.cpp b/wifi/1.6/default/hidl_struct_util.cpp
index 2112b260f3..ff3105dd77 100644
--- a/wifi/1.6/default/hidl_struct_util.cpp
+++ b/wifi/1.6/default/hidl_struct_util.cpp
@@ -2999,6 +2999,71 @@ bool convertLegacyRadioCombinationsMatrixToHidl(
return true;
}
+bool convertLegacyIfaceMaskToIfaceConcurrencyType(
+ u32 mask, std::vector<V1_6::IfaceConcurrencyType>* types) {
+ if (!mask)
+ return false;
+
+#ifndef BIT
+#define BIT(x) (1 << (x))
+#endif
+ if (mask & BIT(WIFI_INTERFACE_TYPE_STA))
+ types->push_back(V1_6::IfaceConcurrencyType::STA);
+ if (mask & BIT(WIFI_INTERFACE_TYPE_AP))
+ types->push_back(V1_6::IfaceConcurrencyType::AP);
+ if (mask & BIT(WIFI_INTERFACE_TYPE_AP_BRIDGED))
+ types->push_back(V1_6::IfaceConcurrencyType::AP_BRIDGED);
+ if (mask & BIT(WIFI_INTERFACE_TYPE_P2P))
+ types->push_back(V1_6::IfaceConcurrencyType::P2P);
+ if (mask & BIT(WIFI_INTERFACE_TYPE_NAN))
+ types->push_back(V1_6::IfaceConcurrencyType::NAN);
+
+ return true;
+}
+
+bool convertLegacyIfaceCombinationsMatrixToChipMode(
+ legacy_hal::wifi_iface_concurrency_matrix* legacy_matrix,
+ V1_6::IWifiChip::ChipMode* chip_mode) {
+ if (!chip_mode || !legacy_matrix) {
+ LOG(ERROR) << "legacy_matrix is null";
+ return false;
+ }
+ *chip_mode = {};
+
+ int num_combinations = legacy_matrix->num_iface_combinations;
+ std::vector<V1_6::IWifiChip::ChipConcurrencyCombination> driver_Combinations_vec;
+ if (!num_combinations) {
+ LOG(ERROR) << "zero iface combinations";
+ return false;
+ }
+
+ for (int i = 0; i < num_combinations; i++) {
+ V1_6::IWifiChip::ChipConcurrencyCombination chipComb;
+ std::vector<V1_6::IWifiChip::ChipConcurrencyCombinationLimit> limits;
+ wifi_iface_combination *comb = &legacy_matrix->iface_combinations[i];
+ if (!comb->num_iface_limits)
+ continue;
+ for (u32 j = 0; j < comb->num_iface_limits; j++) {
+ V1_6::IWifiChip::ChipConcurrencyCombinationLimit chipLimit;
+ chipLimit.maxIfaces = comb->iface_limits[j].max_limit;
+ std::vector<V1_6::IfaceConcurrencyType> types;
+ if (!convertLegacyIfaceMaskToIfaceConcurrencyType(
+ comb->iface_limits[j].iface_mask, &types)) {
+ LOG(ERROR) << "Failed to convert from iface_mask:"
+ << comb->iface_limits[j].iface_mask;
+ return false;
+ }
+ chipLimit.types = hidl_vec(types);
+ limits.push_back(chipLimit);
+ }
+ chipComb.limits = hidl_vec(limits);
+ driver_Combinations_vec.push_back(chipComb);
+ }
+
+ chip_mode->availableCombinations = driver_Combinations_vec;
+ return true;
+}
+
} // namespace hidl_struct_util
} // namespace implementation
} // namespace V1_6
diff --git a/wifi/1.6/default/hidl_struct_util.h b/wifi/1.6/default/hidl_struct_util.h
index 2d4a5f13f4..e86f3302ad 100644
--- a/wifi/1.6/default/hidl_struct_util.h
+++ b/wifi/1.6/default/hidl_struct_util.h
@@ -79,6 +79,9 @@ bool convertLegacyRadioCombinationsMatrixToHidl(
V1_6::WifiRadioCombinationMatrix* hidl_matrix);
V1_5::WifiBand convertLegacyMacBandToHidlWifiBand(uint32_t band);
V1_6::WifiAntennaMode convertLegacyAntennaConfigurationToHidl(uint32_t antenna_cfg);
+bool convertLegacyIfaceCombinationsMatrixToChipMode(
+ legacy_hal::wifi_iface_concurrency_matrix* legacy_matrix,
+ V1_6::IWifiChip::ChipMode* chip_mode);
// STA iface conversion methods.
bool convertLegacyFeaturesToHidlStaCapabilities(uint64_t legacy_feature_set,
diff --git a/wifi/1.6/default/wifi_chip.cpp b/wifi/1.6/default/wifi_chip.cpp
index c7c00b17fd..9c0a15be05 100644
--- a/wifi/1.6/default/wifi_chip.cpp
+++ b/wifi/1.6/default/wifi_chip.cpp
@@ -378,6 +378,36 @@ WifiChip::WifiChip(ChipId chip_id, bool is_primary,
debug_ring_buffer_cb_registered_(false),
subsystemCallbackHandler_(handler) {
setActiveWlanIfaceNameProperty(kNoActiveWlanIfaceNamePropertyValue);
+ using_dynamic_iface_combination_ = false;
+}
+
+void WifiChip::retrieveDynamicIfaceCombination() {
+
+ if (using_dynamic_iface_combination_) return;
+
+ legacy_hal::wifi_iface_concurrency_matrix* legacy_matrix;
+ legacy_hal::wifi_error legacy_status;
+
+ std::tie(legacy_status, legacy_matrix) =
+ legacy_hal_.lock()->getSupportedIfaceConcurrencyMatrix();
+ if (legacy_status != legacy_hal::WIFI_SUCCESS) {
+ LOG(ERROR) << "Failed to get SupportedIfaceCombinations matrix from legacy HAL: "
+ << legacyErrorToString(legacy_status);
+ return;
+ }
+
+ V1_6::IWifiChip::ChipMode hidl_chip_mode;
+ if (!hidl_struct_util::convertLegacyIfaceCombinationsMatrixToChipMode(legacy_matrix,
+ &hidl_chip_mode)) {
+ LOG(ERROR) << "Failed convertLegacyIfaceCombinationsMatrixToChipMode() ";
+ return;
+ }
+
+ LOG(INFO) << "Reloading iface concurrency combination from driver";
+ hidl_chip_mode.id = feature_flags::chip_mode_ids::kV3;
+ modes_.clear();
+ modes_.push_back(hidl_chip_mode);
+ using_dynamic_iface_combination_ = true;
}
void WifiChip::invalidate() {
@@ -1595,6 +1625,8 @@ WifiStatus WifiChip::handleChipConfiguration(
property_set("vendor.wlan.driver.version", version_info.second.driverDescription.c_str());
}
+ // Get the driver supported interface combination.
+ retrieveDynamicIfaceCombination();
return createWifiStatus(WifiStatusCode::SUCCESS);
}
diff --git a/wifi/1.6/default/wifi_chip.h b/wifi/1.6/default/wifi_chip.h
index e8ddaa6f9e..b1a40dc606 100644
--- a/wifi/1.6/default/wifi_chip.h
+++ b/wifi/1.6/default/wifi_chip.h
@@ -281,6 +281,7 @@ class WifiChip : public V1_6::IWifiChip {
WifiBand band, uint32_t ifaceModeMask, uint32_t filterMask);
std::pair<WifiStatus, WifiRadioCombinationMatrix> getSupportedRadioCombinationsMatrixInternal();
std::pair<WifiStatus, std::vector<V1_6::IWifiChip::ChipMode>> getAvailableModesInternal_1_6();
+ void retrieveDynamicIfaceCombination();
ChipId chip_id_;
std::weak_ptr<legacy_hal::WifiLegacyHal> legacy_hal_;
@@ -301,6 +302,7 @@ class WifiChip : public V1_6::IWifiChip {
// registration mechanism. Use this to check if we have already
// registered a callback.
bool debug_ring_buffer_cb_registered_;
+ bool using_dynamic_iface_combination_;
hidl_callback_util::HidlCallbackHandler<V1_4::IWifiChipEventCallback> event_cb_handler_;
const std::function<void(const std::string&)> subsystemCallbackHandler_;
diff --git a/wifi/1.6/default/wifi_legacy_hal.cpp b/wifi/1.6/default/wifi_legacy_hal.cpp
index 2211897cd2..aff1b8cfbf 100644
--- a/wifi/1.6/default/wifi_legacy_hal.cpp
+++ b/wifi/1.6/default/wifi_legacy_hal.cpp
@@ -1589,6 +1589,18 @@ wifi_error WifiLegacyHal::enableWifiTxPowerLimits(const std::string& iface_name,
return global_func_table_.wifi_enable_tx_power_limits(getIfaceHandle(iface_name), enable);
}
+std::pair<wifi_error, wifi_iface_concurrency_matrix*>
+WifiLegacyHal::getSupportedIfaceConcurrencyMatrix() {
+ wifi_iface_concurrency_matrix *iface_concurrency_matrix_ptr =
+ &iface_concurrency_matrix_;
+ wifi_error status = global_func_table_.wifi_get_supported_iface_concurrency_matrix(
+ global_handle_, iface_concurrency_matrix_ptr);
+ if (status != WIFI_SUCCESS)
+ return {status, nullptr};
+
+ return {status, iface_concurrency_matrix_ptr};
+}
+
void WifiLegacyHal::invalidate() {
global_handle_ = nullptr;
iface_name_to_handle_.clear();
diff --git a/wifi/1.6/default/wifi_legacy_hal.h b/wifi/1.6/default/wifi_legacy_hal.h
index 2b923b44a7..f878db4612 100644
--- a/wifi/1.6/default/wifi_legacy_hal.h
+++ b/wifi/1.6/default/wifi_legacy_hal.h
@@ -249,6 +249,9 @@ using ::WIFI_ERROR_UNINITIALIZED;
using ::WIFI_ERROR_UNKNOWN;
using ::wifi_gscan_capabilities;
using ::wifi_hal_fn;
+using ::wifi_iface_combination;
+using ::wifi_iface_concurrency_matrix;
+using ::wifi_iface_limit;
using ::wifi_information_element;
using ::WIFI_INTERFACE_IBSS;
using ::WIFI_INTERFACE_MESH;
@@ -685,6 +688,8 @@ class WifiLegacyHal {
wifi_error enableWifiTxPowerLimits(const std::string& iface_name, bool enable);
+ std::pair<wifi_error, wifi_iface_concurrency_matrix*> getSupportedIfaceConcurrencyMatrix();
+
private:
// Retrieve interface handles for all the available interfaces.
wifi_error retrieveIfaceHandles();
@@ -718,6 +723,8 @@ class WifiLegacyHal {
// such as bring wlan0 interface up/down on start/stop HAL.
// it may be removed once vendor HALs are updated.
bool is_primary_;
+ // Driver supported iface combinations
+ wifi_iface_concurrency_matrix iface_concurrency_matrix_;
};
} // namespace legacy_hal
diff --git a/wifi/1.6/default/wifi_legacy_hal_stubs.cpp b/wifi/1.6/default/wifi_legacy_hal_stubs.cpp
index b3bd37389c..a0ee0c5125 100644
--- a/wifi/1.6/default/wifi_legacy_hal_stubs.cpp
+++ b/wifi/1.6/default/wifi_legacy_hal_stubs.cpp
@@ -167,6 +167,7 @@ bool initHalFuncTableWithStubs(wifi_hal_fn* hal_fn) {
populateStubFor(&hal_fn->wifi_nan_rtt_chre_disable_request);
populateStubFor(&hal_fn->wifi_chre_register_handler);
populateStubFor(&hal_fn->wifi_enable_tx_power_limits);
+ populateStubFor(&hal_fn->wifi_get_supported_iface_concurrency_matrix);
return true;
}
} // namespace legacy_hal