diff options
Diffstat (limited to 'wifi')
-rw-r--r-- | wifi/1.6/default/hidl_struct_util.cpp | 65 | ||||
-rw-r--r-- | wifi/1.6/default/hidl_struct_util.h | 3 | ||||
-rw-r--r-- | wifi/1.6/default/wifi_chip.cpp | 32 | ||||
-rw-r--r-- | wifi/1.6/default/wifi_chip.h | 2 | ||||
-rw-r--r-- | wifi/1.6/default/wifi_legacy_hal.cpp | 12 | ||||
-rw-r--r-- | wifi/1.6/default/wifi_legacy_hal.h | 7 | ||||
-rw-r--r-- | wifi/1.6/default/wifi_legacy_hal_stubs.cpp | 1 |
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 |