diff options
Diffstat (limited to 'wifi/1.5/default/wifi.cpp')
-rw-r--r-- | wifi/1.5/default/wifi.cpp | 110 |
1 files changed, 80 insertions, 30 deletions
diff --git a/wifi/1.5/default/wifi.cpp b/wifi/1.5/default/wifi.cpp index c4e23337c8..17db51d35b 100644 --- a/wifi/1.5/default/wifi.cpp +++ b/wifi/1.5/default/wifi.cpp @@ -21,8 +21,8 @@ #include "wifi_status_util.h" namespace { -// Chip ID to use for the only supported chip. -static constexpr android::hardware::wifi::V1_0::ChipId kChipId = 0; +// Starting Chip ID, will be assigned to primary chip +static constexpr android::hardware::wifi::V1_0::ChipId kPrimaryChipId = 0; } // namespace namespace android { @@ -35,12 +35,12 @@ using hidl_return_util::validateAndCallWithLock; Wifi::Wifi( const std::shared_ptr<wifi_system::InterfaceTool> iface_tool, - const std::shared_ptr<legacy_hal::WifiLegacyHal> legacy_hal, + const std::shared_ptr<legacy_hal::WifiLegacyHalFactory> legacy_hal_factory, const std::shared_ptr<mode_controller::WifiModeController> mode_controller, const std::shared_ptr<iface_util::WifiIfaceUtil> iface_util, const std::shared_ptr<feature_flags::WifiFeatureFlags> feature_flags) : iface_tool_(iface_tool), - legacy_hal_(legacy_hal), + legacy_hal_factory_(legacy_hal_factory), mode_controller_(mode_controller), iface_util_(iface_util), feature_flags_(feature_flags), @@ -84,10 +84,16 @@ Return<void> Wifi::getChip(ChipId chip_id, getChip_cb hidl_status_cb) { Return<void> Wifi::debug(const hidl_handle& handle, const hidl_vec<hidl_string>&) { LOG(INFO) << "-----------Debug is called----------------"; - if (!chip_.get()) { + if (chips_.size() == 0) { return Void(); } - return chip_->debug(handle, {}); + + for (sp<WifiChip> chip : chips_) { + if (!chip.get()) continue; + + chip->debug(handle, {}); + } + return Void(); } WifiStatus Wifi::registerEventCallbackInternal( @@ -120,10 +126,13 @@ WifiStatus Wifi::startInternal() { }; // Create the chip instance once the HAL is started. - // Need to consider the case of multiple chips TODO(156998862) - chip_ = - new WifiChip(kChipId, legacy_hal_, mode_controller_, iface_util_, - feature_flags_, on_subsystem_restart_callback); + android::hardware::wifi::V1_0::ChipId chipId = kPrimaryChipId; + for (auto& hal : legacy_hals_) { + chips_.push_back(new WifiChip( + chipId, chipId == kPrimaryChipId, hal, mode_controller_, + iface_util_, feature_flags_, on_subsystem_restart_callback)); + chipId++; + } run_state_ = RunState::STARTED; for (const auto& callback : event_cb_handler_.getCallbacks()) { if (!callback->onStart().isOk()) { @@ -154,10 +163,13 @@ WifiStatus Wifi::stopInternal( } // Clear the chip object and its child objects since the HAL is now // stopped. - if (chip_.get()) { - chip_->invalidate(); - chip_.clear(); + for (auto& chip : chips_) { + if (chip.get()) { + chip->invalidate(); + chip.clear(); + } } + chips_.clear(); WifiStatus wifi_status = stopLegacyHalAndDeinitializeModeController(lock); if (wifi_status.code == WifiStatusCode::SUCCESS) { for (const auto& callback : event_cb_handler_.getCallbacks()) { @@ -181,21 +193,23 @@ WifiStatus Wifi::stopInternal( std::pair<WifiStatus, std::vector<ChipId>> Wifi::getChipIdsInternal() { std::vector<ChipId> chip_ids; - if (chip_.get()) { - chip_ids.emplace_back(kChipId); + + for (auto& chip : chips_) { + ChipId chip_id = getChipIdFromWifiChip(chip); + if (chip_id != UINT32_MAX) chip_ids.emplace_back(chip_id); } return {createWifiStatus(WifiStatusCode::SUCCESS), std::move(chip_ids)}; } std::pair<WifiStatus, sp<V1_4::IWifiChip>> Wifi::getChipInternal( ChipId chip_id) { - if (!chip_.get()) { - return {createWifiStatus(WifiStatusCode::ERROR_NOT_STARTED), nullptr}; + for (auto& chip : chips_) { + ChipId cand_id = getChipIdFromWifiChip(chip); + if ((cand_id != UINT32_MAX) && (cand_id == chip_id)) + return {createWifiStatus(WifiStatusCode::SUCCESS), chip}; } - if (chip_id != kChipId) { - return {createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS), nullptr}; - } - return {createWifiStatus(WifiStatusCode::SUCCESS), chip_}; + + return {createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS), nullptr}; } WifiStatus Wifi::initializeModeControllerAndLegacyHal() { @@ -203,23 +217,46 @@ WifiStatus Wifi::initializeModeControllerAndLegacyHal() { LOG(ERROR) << "Failed to initialize firmware mode controller"; return createWifiStatus(WifiStatusCode::ERROR_UNKNOWN); } - legacy_hal::wifi_error legacy_status = legacy_hal_->initialize(); - if (legacy_status != legacy_hal::WIFI_SUCCESS) { - LOG(ERROR) << "Failed to initialize legacy HAL: " - << legacyErrorToString(legacy_status); - return createWifiStatusFromLegacyError(legacy_status); + + legacy_hals_ = legacy_hal_factory_->getHals(); + if (legacy_hals_.empty()) + return createWifiStatus(WifiStatusCode::ERROR_UNKNOWN); + int index = 0; // for failure log + for (auto& hal : legacy_hals_) { + legacy_hal::wifi_error legacy_status = hal->initialize(); + if (legacy_status != legacy_hal::WIFI_SUCCESS) { + // Currently WifiLegacyHal::initialize does not allocate extra mem, + // only initializes the function table. If this changes, need to + // implement WifiLegacyHal::deinitialize and deinitalize the + // HALs already initialized + LOG(ERROR) << "Failed to initialize legacy HAL index: " << index + << " error: " << legacyErrorToString(legacy_status); + return createWifiStatusFromLegacyError(legacy_status); + } + index++; } return createWifiStatus(WifiStatusCode::SUCCESS); } WifiStatus Wifi::stopLegacyHalAndDeinitializeModeController( /* NONNULL */ std::unique_lock<std::recursive_mutex>* lock) { + legacy_hal::wifi_error legacy_status = legacy_hal::WIFI_SUCCESS; + int index = 0; + run_state_ = RunState::STOPPING; - legacy_hal::wifi_error legacy_status = - legacy_hal_->stop(lock, [&]() { run_state_ = RunState::STOPPED; }); + for (auto& hal : legacy_hals_) { + legacy_hal::wifi_error tmp = hal->stop(lock, [&]() {}); + if (tmp != legacy_hal::WIFI_SUCCESS) { + LOG(ERROR) << "Failed to stop legacy HAL index: " << index + << " error: " << legacyErrorToString(legacy_status); + legacy_status = tmp; + } + index++; + } + run_state_ = RunState::STOPPED; + if (legacy_status != legacy_hal::WIFI_SUCCESS) { - LOG(ERROR) << "Failed to stop legacy HAL: " - << legacyErrorToString(legacy_status); + LOG(ERROR) << "One or more legacy HALs failed to stop"; return createWifiStatusFromLegacyError(legacy_status); } if (!mode_controller_->deinitialize()) { @@ -228,6 +265,19 @@ WifiStatus Wifi::stopLegacyHalAndDeinitializeModeController( } return createWifiStatus(WifiStatusCode::SUCCESS); } + +ChipId Wifi::getChipIdFromWifiChip(sp<WifiChip>& chip) { + ChipId chip_id = UINT32_MAX; + if (chip.get()) { + chip->getId([&](WifiStatus status, uint32_t id) { + if (status.code == WifiStatusCode::SUCCESS) { + chip_id = id; + } + }); + } + + return chip_id; +} } // namespace implementation } // namespace V1_5 } // namespace wifi |