From 6a1accf8ba6645a8e0fd1213b2318e403674cf40 Mon Sep 17 00:00:00 2001 From: Ahmed ElArabawy Date: Tue, 23 Jan 2018 10:57:29 -0800 Subject: [PATCH] Wifi: Add Support for Body Proximity for SAR This commit extends the SAR support to include scenarios for near head/body and voice calls These features are only applicale for a certain device capability (defined in capability mask) Bug: 3489513 Test: Manual Change-Id: Ie99978df3c19e04fdd3d7862240f6d3c62eac539 Signed-off-by: Ahmed ElArabawy --- wifi/1.2/IWifiChip.hal | 44 +++++++++++++++++++++++++++ wifi/1.2/default/hidl_struct_util.cpp | 29 ++++++++++++++++-- wifi/1.2/default/hidl_struct_util.h | 4 ++- wifi/1.2/default/wifi_chip.cpp | 18 +++++++++-- wifi/1.2/default/wifi_chip.h | 14 +++++---- 5 files changed, 97 insertions(+), 12 deletions(-) diff --git a/wifi/1.2/IWifiChip.hal b/wifi/1.2/IWifiChip.hal index d336a337c6..480c5a23b0 100644 --- a/wifi/1.2/IWifiChip.hal +++ b/wifi/1.2/IWifiChip.hal @@ -26,6 +26,50 @@ import IWifiChipEventCallback; * to perform operations like NAN, RTT, etc. */ interface IWifiChip extends @1.1::IWifiChip { + /** + * Capabilities exposed by this chip. + */ + enum ChipCapabilityMask : @1.1::IWifiChip.ChipCapabilityMask { + /** + * Set/Reset Tx Power limits. + */ + USE_BODY_HEAD_SAR = 1 << 11 + }; + + /** + * List of preset wifi radio TX power levels for different scenarios. + * The actual power values (typically varies based on the channel, + * 802.11 connection type, number of MIMO streams, etc) for each scenario + * is defined by the OEM as a BDF file since it varies for each wifi chip + * vendor and device. + */ + enum TxPowerScenario : @1.1::IWifiChip.TxPowerScenario { + ON_HEAD_CELL_OFF = 1, + ON_HEAD_CELL_ON = 2, + ON_BODY_CELL_OFF = 3, + ON_BODY_CELL_ON = 4 + }; + + /** + * API to select one of the preset TX power scenarios. + * + * The framework must invoke this method with the appropriate scenario to let + * the wifi chip change it's transmitting power levels. + * OEM's should define various power profiles for each of the scenarios + * above (defined in |TxPowerScenario|) in a vendor extension. + * + * @param scenario One of the preselected scenarios defined in + * |TxPowerScenario|. + * @return status WifiStatus of the operation. + * Possible status codes: + * |WifiStatusCode.SUCCESS|, + * |WifiStatusCode.ERROR_WIFI_CHIP_INVALID|, + * |WifiStatusCode.ERROR_NOT_SUPPORTED|, + * |WifiStatusCode.NOT_AVAILABLE|, + * |WifiStatusCode.UNKNOWN| + */ + selectTxPowerScenario_1_2(TxPowerScenario scenario) generates (WifiStatus status); + /** * Requests notifications of significant events on this chip. Multiple calls * to this must register multiple callbacks each of which must receive all diff --git a/wifi/1.2/default/hidl_struct_util.cpp b/wifi/1.2/default/hidl_struct_util.cpp index b1c609e5fd..2e3e0ab439 100644 --- a/wifi/1.2/default/hidl_struct_util.cpp +++ b/wifi/1.2/default/hidl_struct_util.cpp @@ -66,12 +66,14 @@ convertLegacyLoggerFeatureToHidlStaIfaceCapability(uint32_t feature) { return {}; } -V1_1::IWifiChip::ChipCapabilityMask convertLegacyFeatureToHidlChipCapability( +IWifiChip::ChipCapabilityMask convertLegacyFeatureToHidlChipCapability( uint32_t feature) { - using HidlChipCaps = V1_1::IWifiChip::ChipCapabilityMask; + using HidlChipCaps = IWifiChip::ChipCapabilityMask; switch (feature) { case WIFI_FEATURE_SET_TX_POWER_LIMIT: return HidlChipCaps::SET_TX_POWER_LIMIT; + case WIFI_FEATURE_USE_BODY_HEAD_SAR: + return HidlChipCaps::USE_BODY_HEAD_SAR; case WIFI_FEATURE_D2D_RTT: return HidlChipCaps::D2D_RTT; case WIFI_FEATURE_D2AP_RTT: @@ -135,6 +137,7 @@ bool convertLegacyFeaturesToHidlChipCapabilities( } } for (const auto feature : {WIFI_FEATURE_SET_TX_POWER_LIMIT, + WIFI_FEATURE_USE_BODY_HEAD_SAR, WIFI_FEATURE_D2D_RTT, WIFI_FEATURE_D2AP_RTT}) { if (feature & legacy_feature_set) { *hidl_caps |= convertLegacyFeatureToHidlChipCapability(feature); @@ -260,12 +263,32 @@ bool convertLegacyWakeReasonStatsToHidl( legacy_hal::wifi_power_scenario convertHidlTxPowerScenarioToLegacy( V1_1::IWifiChip::TxPowerScenario hidl_scenario) { switch (hidl_scenario) { - case V1_1::IWifiChip::TxPowerScenario::VOICE_CALL: + // This is the only supported scenario for V1_1 + case V1_1::IWifiChip::TxPowerScenario::VOICE_CALL: return legacy_hal::WIFI_POWER_SCENARIO_VOICE_CALL; }; CHECK(false); } +legacy_hal::wifi_power_scenario convertHidlTxPowerScenarioToLegacy_1_2( + IWifiChip::TxPowerScenario hidl_scenario) { + switch (hidl_scenario) { + // This is the only supported scenario for V1_1 + case IWifiChip::TxPowerScenario::VOICE_CALL: + return legacy_hal::WIFI_POWER_SCENARIO_VOICE_CALL; + // Those are the supported scenarios for V1_2 + case IWifiChip::TxPowerScenario::ON_HEAD_CELL_OFF: + return legacy_hal::WIFI_POWER_SCENARIO_ON_HEAD_CELL_OFF; + case IWifiChip::TxPowerScenario::ON_HEAD_CELL_ON: + return legacy_hal::WIFI_POWER_SCENARIO_ON_HEAD_CELL_ON; + case IWifiChip::TxPowerScenario::ON_BODY_CELL_OFF: + return legacy_hal::WIFI_POWER_SCENARIO_ON_BODY_CELL_OFF; + case IWifiChip::TxPowerScenario::ON_BODY_CELL_ON: + return legacy_hal::WIFI_POWER_SCENARIO_ON_BODY_CELL_ON; + }; + CHECK(false); +} + bool convertLegacyWifiMacInfoToHidl( const legacy_hal::WifiMacInfo& legacy_mac_info, IWifiChipEventCallback::RadioModeInfo* hidl_radio_mode_info) { diff --git a/wifi/1.2/default/hidl_struct_util.h b/wifi/1.2/default/hidl_struct_util.h index ce4bb81aad..3c789c046f 100644 --- a/wifi/1.2/default/hidl_struct_util.h +++ b/wifi/1.2/default/hidl_struct_util.h @@ -21,7 +21,7 @@ #include #include -#include +#include #include #include @@ -56,6 +56,8 @@ bool convertLegacyWakeReasonStatsToHidl( WifiDebugHostWakeReasonStats* hidl_stats); legacy_hal::wifi_power_scenario convertHidlTxPowerScenarioToLegacy( V1_1::IWifiChip::TxPowerScenario hidl_scenario); +legacy_hal::wifi_power_scenario convertHidlTxPowerScenarioToLegacy_1_2( + IWifiChip::TxPowerScenario hidl_scenario); bool convertLegacyWifiMacInfosToHidl( const std::vector& legacy_mac_infos, std::vector* hidl_radio_mode_infos); diff --git a/wifi/1.2/default/wifi_chip.cpp b/wifi/1.2/default/wifi_chip.cpp index 38301e96fa..05ea638409 100644 --- a/wifi/1.2/default/wifi_chip.cpp +++ b/wifi/1.2/default/wifi_chip.cpp @@ -507,7 +507,7 @@ Return WifiChip::enableDebugErrorAlerts( } Return WifiChip::selectTxPowerScenario( - TxPowerScenario scenario, selectTxPowerScenario_cb hidl_status_cb) { + V1_1::IWifiChip::TxPowerScenario scenario, selectTxPowerScenario_cb hidl_status_cb) { return validateAndCall(this, WifiStatusCode::ERROR_WIFI_CHIP_INVALID, &WifiChip::selectTxPowerScenarioInternal, hidl_status_cb, scenario); @@ -528,6 +528,12 @@ Return WifiChip::registerEventCallback_1_2( hidl_status_cb, event_callback); } +Return WifiChip::selectTxPowerScenario_1_2( + TxPowerScenario scenario, selectTxPowerScenario_cb hidl_status_cb) { + return validateAndCall(this, WifiStatusCode::ERROR_WIFI_CHIP_INVALID, + &WifiChip::selectTxPowerScenarioInternal_1_2, hidl_status_cb, scenario); +} + Return WifiChip::debug(const hidl_handle& handle, const hidl_vec&) { if (handle != nullptr && handle->numFds >= 1) { @@ -990,7 +996,8 @@ WifiStatus WifiChip::enableDebugErrorAlertsInternal(bool enable) { return createWifiStatusFromLegacyError(legacy_status); } -WifiStatus WifiChip::selectTxPowerScenarioInternal(TxPowerScenario scenario) { +WifiStatus WifiChip::selectTxPowerScenarioInternal( + V1_1::IWifiChip::TxPowerScenario scenario) { auto legacy_status = legacy_hal_.lock()->selectTxPowerScenario( getWlan0IfaceName(), hidl_struct_util::convertHidlTxPowerScenarioToLegacy(scenario)); @@ -1011,6 +1018,13 @@ WifiStatus WifiChip::registerEventCallbackInternal_1_2( return createWifiStatus(WifiStatusCode::SUCCESS); } +WifiStatus WifiChip::selectTxPowerScenarioInternal_1_2(TxPowerScenario scenario) { + auto legacy_status = legacy_hal_.lock()->selectTxPowerScenario( + getWlan0IfaceName(), + hidl_struct_util::convertHidlTxPowerScenarioToLegacy_1_2(scenario)); + return createWifiStatusFromLegacyError(legacy_status); +} + WifiStatus WifiChip::handleChipConfiguration( /* NONNULL */ std::unique_lock* lock, ChipModeId mode_id) { diff --git a/wifi/1.2/default/wifi_chip.h b/wifi/1.2/default/wifi_chip.h index 24a5486276..ada945885e 100644 --- a/wifi/1.2/default/wifi_chip.h +++ b/wifi/1.2/default/wifi_chip.h @@ -132,16 +132,18 @@ class WifiChip : public V1_2::IWifiChip { Return enableDebugErrorAlerts( bool enable, enableDebugErrorAlerts_cb hidl_status_cb) override; Return selectTxPowerScenario( - TxPowerScenario scenario, + V1_1::IWifiChip::TxPowerScenario scenario, selectTxPowerScenario_cb hidl_status_cb) override; Return resetTxPowerScenario( resetTxPowerScenario_cb hidl_status_cb) override; - Return debug(const hidl_handle& handle, - const hidl_vec& options) override; Return registerEventCallback_1_2( const sp& event_callback, registerEventCallback_1_2_cb hidl_status_cb) override; - + Return selectTxPowerScenario_1_2( + TxPowerScenario scenario, + selectTxPowerScenario_cb hidl_status_cb) override; + Return debug(const hidl_handle& handle, + const hidl_vec& options) override; private: void invalidateAndRemoveAllIfaces(); @@ -193,11 +195,11 @@ class WifiChip : public V1_2::IWifiChip { std::pair getDebugHostWakeReasonStatsInternal(); WifiStatus enableDebugErrorAlertsInternal(bool enable); - WifiStatus selectTxPowerScenarioInternal(TxPowerScenario scenario); + WifiStatus selectTxPowerScenarioInternal(V1_1::IWifiChip::TxPowerScenario scenario); WifiStatus resetTxPowerScenarioInternal(); WifiStatus registerEventCallbackInternal_1_2( const sp& event_callback); - + WifiStatus selectTxPowerScenarioInternal_1_2(TxPowerScenario scenario); WifiStatus handleChipConfiguration( std::unique_lock* lock, ChipModeId mode_id); WifiStatus registerDebugRingBufferCallback();