diff --git a/radio/1.6/IRadio.hal b/radio/1.6/IRadio.hal index 5f5f5c160f..ca40a17b24 100644 --- a/radio/1.6/IRadio.hal +++ b/radio/1.6/IRadio.hal @@ -181,4 +181,28 @@ interface IRadio extends @1.5::IRadio { * */ oneway sendCdmaSmsExpectMore_1_6(int32_t serial, CdmaSmsMessage sms); + + /** + * Enable or disable E-UTRA-NR dual connectivity. If disabled then UE will not connect + * to secondary carrier. + * + * @param serial Serial number of request. + * @param nrDualConnectivityState expected NR dual connectivity state. + * 1. Enable NR dual connectivity {NrDualConnectivityState:ENABLE} + * 2. Disable NR dual connectivity {NrDualConnectivityState:DISABLE} + * 3. Disable NR dual connectivity and force secondary cell to be released + * {NrDualConnectivityState:DISABLE_IMMEDIATE} + + * Response callback is IRadioResponse.enableNRDualConnectivityResponse() + */ + oneway enableNrDualConnectivity(int32_t serial, + NrDualConnectivityState nrDualConnectivityState); + + /** + * Is E-UTRA-NR Dual Connectivity enabled + * + * @param serial Serial number of request. + * Response callback is IRadioResponse.isNRDualConnectivityEnabledResponse() + */ + oneway isNrDualConnectivityEnabled(int32_t serial); }; diff --git a/radio/1.6/IRadioResponse.hal b/radio/1.6/IRadioResponse.hal index fed7e79b54..4ff7e47f12 100644 --- a/radio/1.6/IRadioResponse.hal +++ b/radio/1.6/IRadioResponse.hal @@ -200,4 +200,26 @@ interface IRadioResponse extends @1.5::IRadioResponse { * RadioError:BLOCKED_DUE_TO_CALL */ oneway sendCdmaSmsExpectMoreResponse_1_6(RadioResponseInfo info, SendSmsResult sms); + + /** + * @param info Response info struct containing response type, serial no. and error + * + * Valid errors returned: + * RadioError:NONE + * RadioError:RADIO_NOT_AVAILABLE + * RadioError:INTERNAL_ERR + */ + oneway enableNrDualConnectivityResponse(RadioResponseInfo info); + + /** + * @param info Response info struct containing response type, serial no. and error + * + * @param isEnabled Indicates whether NR dual connectivity is enabled or not, True if enabled + * else false. + * Valid errors returned: + * RadioError:NONE + * RadioError:RADIO_NOT_AVAILABLE + * RadioError:INTERNAL_ERR + */ + oneway isNrDualConnectivityEnabledResponse(RadioResponseInfo info, bool isEnabled); }; diff --git a/radio/1.6/types.hal b/radio/1.6/types.hal index c77a86db60..07b49771c5 100644 --- a/radio/1.6/types.hal +++ b/radio/1.6/types.hal @@ -255,3 +255,24 @@ struct SetupDataCallResult { /** Specifies the fallback mode on an IWLAN handover failure. */ HandoverFailureMode handoverFailureMode; }; + +/** + * NR Dual connectivity state + */ +enum NrDualConnectivityState: int32_t { + /** + * Enable NR dual connectivity. Enabled state does not mean dual connectivity + * is active. It means device is allowed to connect to both primary and secondary. + */ + ENABLE = 1, + /** + * Disable NR dual connectivity. Disabled state does not mean secondary cell is released. + * Modem will release it only if current bearer is released to avoid radio link failure. + */ + DISABLE = 2, + /** + * Disable NR dual connectivity and force secondary cell to be released if dual connectivity + * was active. This may result in radio link failure. + */ + DISABLE_IMMEDIATE= 3, +}; diff --git a/radio/1.6/vts/functional/radio_hidl_hal_api.cpp b/radio/1.6/vts/functional/radio_hidl_hal_api.cpp index 8f3b991d42..01236c6a4e 100644 --- a/radio/1.6/vts/functional/radio_hidl_hal_api.cpp +++ b/radio/1.6/vts/functional/radio_hidl_hal_api.cpp @@ -63,7 +63,6 @@ TEST_P(RadioHidlTest_v1_6, setupDataCall_1_6) { EXPECT_EQ(std::cv_status::no_timeout, wait()); EXPECT_EQ(RadioResponseType::SOLICITED, radioRsp_v1_6->rspInfo.type); EXPECT_EQ(serial, radioRsp_v1_6->rspInfo.serial); - if (cardStatus.base.base.base.cardState == CardState::ABSENT) { ASSERT_TRUE(CheckAnyOfErrors( radioRsp_v1_6->rspInfo.error, @@ -259,3 +258,40 @@ TEST_P(RadioHidlTest_v1_6, setRadioPower_1_6_emergencyCall_cancelled) { EXPECT_EQ(serial, radioRsp_v1_6->rspInfo.serial); EXPECT_EQ(::android::hardware::radio::V1_6::RadioError::NONE, radioRsp_v1_6->rspInfo.error); } + +/* + * Test IRadio.enableNrDualConnectivity() for the response returned. + */ +TEST_P(RadioHidlTest_v1_6, enableNrDualConnectivity) { + serial = GetRandomSerialNumber(); + + Return res = + radio_v1_6->enableNrDualConnectivity(serial, NrDualConnectivityState::DISABLE); + ASSERT_OK(res); + + EXPECT_EQ(std::cv_status::no_timeout, wait()); + EXPECT_EQ(RadioResponseType::SOLICITED, radioRsp_v1_6->rspInfo.type); + EXPECT_EQ(serial, radioRsp_v1_6->rspInfo.serial); + ASSERT_TRUE(CheckAnyOfErrors(radioRsp_v1_6->rspInfo.error, + {::android::hardware::radio::V1_6::RadioError::RADIO_NOT_AVAILABLE, + ::android::hardware::radio::V1_6::RadioError::INTERNAL_ERR, + ::android::hardware::radio::V1_6::RadioError::NONE})); +} + +/* + * Test IRadio.isNrDualConnectivityEnabled() for the response returned. + */ +TEST_P(RadioHidlTest_v1_6, isNrDualConnectivityEnabled) { + serial = GetRandomSerialNumber(); + + Return res = radio_v1_6->isNrDualConnectivityEnabled(serial); + ASSERT_OK(res); + + EXPECT_EQ(std::cv_status::no_timeout, wait()); + EXPECT_EQ(RadioResponseType::SOLICITED, radioRsp_v1_6->rspInfo.type); + EXPECT_EQ(serial, radioRsp_v1_6->rspInfo.serial); + ASSERT_TRUE(CheckAnyOfErrors(radioRsp_v1_6->rspInfo.error, + {::android::hardware::radio::V1_6::RadioError::RADIO_NOT_AVAILABLE, + ::android::hardware::radio::V1_6::RadioError::INTERNAL_ERR, + ::android::hardware::radio::V1_6::RadioError::NONE})); +} diff --git a/radio/1.6/vts/functional/radio_hidl_hal_utils_v1_6.h b/radio/1.6/vts/functional/radio_hidl_hal_utils_v1_6.h index d90aa806dc..784bcd91e8 100644 --- a/radio/1.6/vts/functional/radio_hidl_hal_utils_v1_6.h +++ b/radio/1.6/vts/functional/radio_hidl_hal_utils_v1_6.h @@ -78,6 +78,7 @@ class RadioResponse_v1_6 : public ::android::hardware::radio::V1_6::IRadioRespon // Modem bool isModemEnabled; bool enableModemResponseToggle; + bool isNRDualConnectivityEnabled; ::android::hardware::hidl_bitfield<::android::hardware::radio::V1_4::RadioAccessFamily> networkTypeBitmapResponse; @@ -765,6 +766,11 @@ class RadioResponse_v1_6 : public ::android::hardware::radio::V1_6::IRadioRespon Return sendCdmaSmsExpectMoreResponse_1_6( const ::android::hardware::radio::V1_6::RadioResponseInfo& info, const SendSmsResult& sms); + + Return enableNrDualConnectivityResponse( + const ::android::hardware::radio::V1_6::RadioResponseInfo& info); + Return isNrDualConnectivityEnabledResponse( + const ::android::hardware::radio::V1_6::RadioResponseInfo& info, bool isEnabled); }; /* Callback class for radio indication */ diff --git a/radio/1.6/vts/functional/radio_response.cpp b/radio/1.6/vts/functional/radio_response.cpp index 574990d5db..ffa384ed9b 100644 --- a/radio/1.6/vts/functional/radio_response.cpp +++ b/radio/1.6/vts/functional/radio_response.cpp @@ -1055,6 +1055,12 @@ Return RadioResponse_v1_6::setupDataCallResponse_1_6( parent_v1_6.notify(info.serial); return Void(); } +Return RadioResponse_v1_6::enableNrDualConnectivityResponse( + const ::android::hardware::radio::V1_6::RadioResponseInfo& info) { + rspInfo = info; + parent_v1_6.notify(info.serial); + return Void(); +} Return RadioResponse_v1_6::getDataCallListResponse_1_6( const ::android::hardware::radio::V1_6::RadioResponseInfo& info, @@ -1099,3 +1105,11 @@ Return RadioResponse_v1_6::sendCdmaSmsExpectMoreResponse_1_6( parent_v1_6.notify(info.serial); return Void(); } + +Return RadioResponse_v1_6::isNrDualConnectivityEnabledResponse( + const ::android::hardware::radio::V1_6::RadioResponseInfo& info, bool isEnabled) { + rspInfo = info; + isNRDualConnectivityEnabled = isEnabled; + parent_v1_6.notify(info.serial); + return Void(); +}