From e29df60bdcd99888b2b0ef032f9df9d8d9becd7b Mon Sep 17 00:00:00 2001 From: Tim Lin Date: Sat, 26 Sep 2020 22:43:24 +0800 Subject: [PATCH] add new RadioError Support RadioError:RF_HARDWARE_ISSUE and RadioError:NO_RF_CALIBRATION_INFO for setRadioPowerResponse_1_6(). Bug: 170938075 Test: build. VTS on Cuttlefish. Change-Id: Iaf582c31f439810db34693c61e58ff1f4dfd19fd --- radio/1.6/IRadio.hal | 30 +++++++++++++++++ radio/1.6/IRadioResponse.hal | 12 +++++++ radio/1.6/types.hal | 17 +++++++++- radio/1.6/vts/functional/Android.bp | 5 ++- .../1.6/vts/functional/radio_hidl_hal_api.cpp | 32 +++++++++++++++++++ .../vts/functional/radio_hidl_hal_test.cpp | 15 ++++++--- .../functional/radio_hidl_hal_utils_v1_6.h | 7 ++++ radio/1.6/vts/functional/radio_response.cpp | 14 ++++++-- 8 files changed, 124 insertions(+), 8 deletions(-) diff --git a/radio/1.6/IRadio.hal b/radio/1.6/IRadio.hal index 002b183635..5f5f5c160f 100644 --- a/radio/1.6/IRadio.hal +++ b/radio/1.6/IRadio.hal @@ -34,6 +34,36 @@ import @1.5::LinkAddress; * setResponseFunctions must work with @1.6::IRadioResponse and @1.6::IRadioIndication. */ interface IRadio extends @1.5::IRadio { + /** + * Toggle radio on and off (for "airplane" mode) + * If the radio is turned off/on the radio modem subsystem + * is expected return to an initialized state. For instance, + * any voice and data calls must be terminated and all associated + * lists emptied. + * + * When setting radio power on to exit from airplane mode to place an emergency call on this + * logical modem, powerOn, forEmergencyCall and preferredForEmergencyCall must be true. In + * this case, this modem is optimized to scan only emergency call bands, until: + * 1) Emergency call is completed; or + * 2) Another setRadioPower_1_5 is issued with forEmergencyCall being false or + * preferredForEmergencyCall being false; or + * 3) Timeout after 30 seconds if dial or emergencyDial is not called. + * Once one of these conditions is reached, the modem should move into normal operation. + * + * @param serial Serial number of request. + * @param powerOn To turn on radio -> on = true, to turn off radio -> on = false. + * @param forEmergencyCall To indication to radio if this request is due to emergency call. + * No effect if powerOn is false. + * @param preferredForEmergencyCall indicate whether the following emergency call will be sent + * on this modem or not. No effect if forEmergencyCall is false, or powerOn is false. + * + * Response callback is IRadioConfigResponse. setRadioPowerResponse_1_6. + + * Note this API is the same as the 1.5 + */ + oneway setRadioPower_1_6(int32_t serial, bool powerOn, bool forEmergencyCall, + bool preferredForEmergencyCall); + /** * Returns the data call list. An entry is added when a setupDataCall() is issued and removed * on a deactivateDataCall(). The list is emptied when setRadioPower() off/on issued or when diff --git a/radio/1.6/IRadioResponse.hal b/radio/1.6/IRadioResponse.hal index dfacd666d2..fed7e79b54 100644 --- a/radio/1.6/IRadioResponse.hal +++ b/radio/1.6/IRadioResponse.hal @@ -25,6 +25,18 @@ import @1.6::SetupDataCallResult; * Interface declaring response functions to solicited radio requests. */ interface IRadioResponse extends @1.5::IRadioResponse { + /** + * @param info Response info struct containing response type, serial no. and error + * + * Valid errors returned: + * RadioError:NONE + * RadioError:INTERNAL_ERR + * RadioError:INVALID_ARGUMENTS + * RadioError:RF_HARDWARE_ISSUE + * RadioError:NO_RF_CALIBRATION_INFO + */ + oneway setRadioPowerResponse_1_6(RadioResponseInfo info); + /** * @param info Response info struct containing response type, serial no. and error * @param dcResponse SetupDataCallResult defined in types.hal diff --git a/radio/1.6/types.hal b/radio/1.6/types.hal index eee958f89f..c77a86db60 100644 --- a/radio/1.6/types.hal +++ b/radio/1.6/types.hal @@ -111,7 +111,22 @@ enum RadioError : @1.0::RadioError { * SMS is blocked due to call control, e.g., resource unavailable * in the SMR entity. */ - BLOCKED_DUE_TO_CALL = 69 + BLOCKED_DUE_TO_CALL = 69, + + /** + * Returned from setRadioPowerResponse when detecting RF HW issues. Some RF + * Front-End(RFFE) components like antenna are considered critical for modem + * to provide telephony service. This RadioError is used when modem detect + * such RFFE problem. + */ + RF_HARDWARE_ISSUE = 70, + + /** + * Returned from setRadioPowerResponse when detecting no RF calibration + * issue. Unlike RF_HARDWARE_ISSUE, this is a SW problem and no HW repair is + * needed. + */ + NO_RF_CALIBRATION_INFO = 71, }; /** diff --git a/radio/1.6/vts/functional/Android.bp b/radio/1.6/vts/functional/Android.bp index 5fd30ce78f..db90f88618 100644 --- a/radio/1.6/vts/functional/Android.bp +++ b/radio/1.6/vts/functional/Android.bp @@ -38,5 +38,8 @@ cc_test { "android.hardware.radio.config@1.1", ], header_libs: ["radio.util.header@1.0"], - test_suites: ["general-tests", "vts"] + test_suites: [ + "general-tests", + "vts", + ], } 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 300f748476..8f3b991d42 100644 --- a/radio/1.6/vts/functional/radio_hidl_hal_api.cpp +++ b/radio/1.6/vts/functional/radio_hidl_hal_api.cpp @@ -227,3 +227,35 @@ TEST_P(RadioHidlTest_v1_6, sendCdmaSmsExpectMore_1_6) { CHECK_GENERAL_ERROR)); } } + +/* + * Test IRadio.setRadioPower_1_6() for the response returned by + * IRadio.setRadioPowerResponse_1_6(). + */ +TEST_P(RadioHidlTest_v1_6, setRadioPower_1_6_emergencyCall_cancelled) { + // Set radio power to off. + serial = GetRandomSerialNumber(); + radio_v1_6->setRadioPower_1_6(serial, false, false, false); + 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); + EXPECT_EQ(::android::hardware::radio::V1_6::RadioError::NONE, radioRsp_v1_6->rspInfo.error); + + // Set radio power to on with forEmergencyCall being true. This should put modem to only scan + // emergency call bands. + serial = GetRandomSerialNumber(); + radio_v1_6->setRadioPower_1_6(serial, true, true, true); + 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); + EXPECT_EQ(::android::hardware::radio::V1_6::RadioError::NONE, radioRsp_v1_6->rspInfo.error); + + // Set radio power to on with forEmergencyCall being false. This should put modem in regular + // operation modem. + serial = GetRandomSerialNumber(); + radio_v1_6->setRadioPower_1_6(serial, true, false, false); + 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); + EXPECT_EQ(::android::hardware::radio::V1_6::RadioError::NONE, radioRsp_v1_6->rspInfo.error); +} diff --git a/radio/1.6/vts/functional/radio_hidl_hal_test.cpp b/radio/1.6/vts/functional/radio_hidl_hal_test.cpp index 3d0e71cf8b..79c3cde745 100644 --- a/radio/1.6/vts/functional/radio_hidl_hal_test.cpp +++ b/radio/1.6/vts/functional/radio_hidl_hal_test.cpp @@ -30,10 +30,11 @@ void RadioHidlTest_v1_6::SetUp() { radio_v1_6->setResponseFunctions(radioRsp_v1_6, radioInd_v1_6); - getDataCallList(); - EXPECT_EQ(RadioResponseType::SOLICITED, radioRsp_v1_6->rspInfo.type); - EXPECT_EQ(serial, radioRsp_v1_6->rspInfo.serial); - EXPECT_EQ(::android::hardware::radio::V1_6::RadioError::NONE, radioRsp_v1_6->rspInfo.error); + updateSimCardStatus(); + EXPECT_EQ(RadioResponseType::SOLICITED, radioRsp_v1_6->rspInfo_v1_0.type); + EXPECT_EQ(serial, radioRsp_v1_6->rspInfo_v1_0.serial); + EXPECT_EQ(::android::hardware::radio::V1_0::RadioError::NONE, + radioRsp_v1_6->rspInfo_v1_0.error); sp<::android::hardware::radio::config::V1_1::IRadioConfig> radioConfig = ::android::hardware::radio::config::V1_1::IRadioConfig::getService(); @@ -73,6 +74,12 @@ std::cv_status RadioHidlTest_v1_6::wait() { return status; } +void RadioHidlTest_v1_6::updateSimCardStatus() { + serial = GetRandomSerialNumber(); + radio_v1_6->getIccCardStatus(serial); + EXPECT_EQ(std::cv_status::no_timeout, wait()); +} + void RadioHidlTest_v1_6::getDataCallList() { serial = GetRandomSerialNumber(); radio_v1_6->getDataCallList_1_6(serial); 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 16fe8c83b2..d90aa806dc 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 @@ -66,6 +66,7 @@ class RadioResponse_v1_6 : public ::android::hardware::radio::V1_6::IRadioRespon public: hidl_vec radioBandModes; + ::android::hardware::radio::V1_0::RadioResponseInfo rspInfo_v1_0; ::android::hardware::radio::V1_6::RadioResponseInfo rspInfo; // Call @@ -738,6 +739,9 @@ class RadioResponse_v1_6 : public ::android::hardware::radio::V1_6::IRadioRespon const ::android::hardware::radio::V1_5::CardStatus& card_status); /* 1.6 Api */ + Return setRadioPowerResponse_1_6( + const ::android::hardware::radio::V1_6::RadioResponseInfo& info); + Return setupDataCallResponse_1_6( const ::android::hardware::radio::V1_6::RadioResponseInfo& info, const android::hardware::radio::V1_6::SetupDataCallResult& dcResponse); @@ -995,6 +999,9 @@ class RadioHidlTest_v1_6 : public ::testing::TestWithParam { /* Clear Potential Established Calls */ void clearPotentialEstablishedCalls(); + /* Update Sim Card Status */ + void updateSimCardStatus(); + /* Get current data call list */ void getDataCallList(); diff --git a/radio/1.6/vts/functional/radio_response.cpp b/radio/1.6/vts/functional/radio_response.cpp index a598ac17ea..574990d5db 100644 --- a/radio/1.6/vts/functional/radio_response.cpp +++ b/radio/1.6/vts/functional/radio_response.cpp @@ -1032,12 +1032,22 @@ Return RadioResponse_v1_6::supplySimDepersonalizationResponse( } Return RadioResponse_v1_6::getIccCardStatusResponse_1_5( - const ::android::hardware::radio::V1_0::RadioResponseInfo& /*info*/, - const ::android::hardware::radio::V1_5::CardStatus& /*card_status*/) { + const ::android::hardware::radio::V1_0::RadioResponseInfo& info, + const ::android::hardware::radio::V1_5::CardStatus& card_status) { + rspInfo_v1_0 = info; + cardStatus = card_status; + parent_v1_6.notify(info.serial); return Void(); } /* 1.6 Apis */ +Return RadioResponse_v1_6::setRadioPowerResponse_1_6( + const ::android::hardware::radio::V1_6::RadioResponseInfo& info) { + rspInfo = info; + parent_v1_6.notify(info.serial); + return Void(); +} + Return RadioResponse_v1_6::setupDataCallResponse_1_6( const ::android::hardware::radio::V1_6::RadioResponseInfo& info, const android::hardware::radio::V1_6::SetupDataCallResult& /* dcResponse */) {