Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cd566bdd authored by Roshan Pius's avatar Roshan Pius
Browse files

wifi: Add support for multiple chips in IWifi

The modified HIDL interface supports multiple chip instances on the
device. Modify the |IWifi| interface implementation to support the new
methods.

NOTE: The legacy HAL implementation will continue to only expose 1 chip.

While there,
Change the |callbacks_| member to std::vector instead of std::set. We
don't really need a set to store the list of callbacks.

Bug: 32003988
Test: Compiles
Change-Id: I31e704100f716e223095890279bdf93d2a04377e
parent fcbf923d
Loading
Loading
Loading
Loading
+24 −4
Original line number Diff line number Diff line
@@ -21,6 +21,11 @@
#include "failure_reason_util.h"
#include "wifi_chip.h"

namespace {
// Chip ID to use for the only supported chip.
static constexpr android::hardware::wifi::V1_0::ChipId kChipId = 0;
}  // namespace

namespace android {
namespace hardware {
namespace wifi {
@@ -33,7 +38,7 @@ Wifi::Wifi()
Return<void> Wifi::registerEventCallback(
    const sp<IWifiEventCallback>& callback) {
  // TODO(b/31632518): remove the callback when the client is destroyed
  callbacks_.insert(callback);
  callbacks_.emplace_back(callback);
  return Void();
}

@@ -67,7 +72,7 @@ Return<void> Wifi::start() {
  }

  // Create the chip instance once the HAL is started.
  chip_ = new WifiChip(legacy_hal_);
  chip_ = new WifiChip(kChipId, legacy_hal_);
  run_state_ = RunState::STARTED;
  for (const auto& callback : callbacks_) {
    callback->onStart();
@@ -108,8 +113,23 @@ Return<void> Wifi::stop() {
  return Void();
}

Return<void> Wifi::getChip(getChip_cb cb) {
Return<void> Wifi::getChipIds(getChipIds_cb cb) {
  std::vector<ChipId> chip_ids;
  if (chip_.get()) {
    chip_ids.emplace_back(kChipId);
  }
  hidl_vec<ChipId> hidl_data;
  hidl_data.setToExternal(chip_ids.data(), chip_ids.size());
  cb(hidl_data);
  return Void();
}

Return<void> Wifi::getChip(ChipId chip_id, getChip_cb cb) {
  if (chip_.get() && chip_id == kChipId) {
    cb(chip_);
  } else {
    cb(nullptr);
  }
  return Void();
}

+3 −3
Original line number Diff line number Diff line
@@ -18,7 +18,6 @@
#define WIFI_H_

#include <functional>
#include <set>

#include <android-base/macros.h>
#include <android/hardware/wifi/1.0/IWifi.h>
@@ -46,7 +45,8 @@ class Wifi : public IWifi {
  Return<bool> isStarted() override;
  Return<void> start() override;
  Return<void> stop() override;
  Return<void> getChip(getChip_cb cb) override;
  Return<void> getChipIds(getChipIds_cb cb) override;
  Return<void> getChip(ChipId chip_id, getChip_cb cb) override;

 private:
  enum class RunState { STOPPED, STARTED, STOPPING };
@@ -55,7 +55,7 @@ class Wifi : public IWifi {
  // and shared with all the child HIDL interface objects.
  std::shared_ptr<WifiLegacyHal> legacy_hal_;
  RunState run_state_;
  std::set<sp<IWifiEventCallback>> callbacks_;
  std::vector<sp<IWifiEventCallback>> callbacks_;
  sp<WifiChip> chip_;

  DISALLOW_COPY_AND_ASSIGN(Wifi);
+7 −2
Original line number Diff line number Diff line
@@ -26,14 +26,19 @@ namespace wifi {
namespace V1_0 {
namespace implementation {

WifiChip::WifiChip(std::weak_ptr<WifiLegacyHal> legacy_hal)
    : legacy_hal_(legacy_hal) {}
WifiChip::WifiChip(ChipId chip_id,
                   const std::weak_ptr<WifiLegacyHal> legacy_hal)
    : chip_id_(chip_id), legacy_hal_(legacy_hal) {}

void WifiChip::invalidate() {
  legacy_hal_.reset();
  callbacks_.clear();
}

Return<ChipId> WifiChip::getId() {
  return chip_id_;
}

Return<void> WifiChip::registerEventCallback(
    const sp<IWifiChipEventCallback>& callback) {
  if (!legacy_hal_.lock())
+3 −1
Original line number Diff line number Diff line
@@ -37,11 +37,12 @@ namespace implementation {
 */
class WifiChip : public IWifiChip {
 public:
  WifiChip(std::weak_ptr<WifiLegacyHal> legacy_hal);
  WifiChip(ChipId chip_id, const std::weak_ptr<WifiLegacyHal> legacy_hal);
  // Invalidate this instance once the HAL is stopped.
  void invalidate();

  // HIDL methods exposed.
  Return<ChipId> getId() override;
  Return<void> registerEventCallback(
      const sp<IWifiChipEventCallback>& callback) override;
  Return<void> getAvailableModes(getAvailableModes_cb cb) override;
@@ -52,6 +53,7 @@ class WifiChip : public IWifiChip {
  Return<void> requestFirmwareDebugDump() override;

 private:
  ChipId chip_id_;
  std::weak_ptr<WifiLegacyHal> legacy_hal_;
  std::set<sp<IWifiChipEventCallback>> callbacks_;