int ipc_pwr_phone_state(struct ipc_message *message) { struct ipc_pwr_phone_state_response_data *data; if (message == NULL || message->data == NULL || message->size < sizeof(struct ipc_pwr_phone_state_response_data)) return -1; if (!ipc_seq_valid(message->aseq)) return 0; data = (struct ipc_pwr_phone_state_response_data *) message->data; switch (data->state) { case IPC_PWR_PHONE_STATE_RESPONSE_LPM: RIL_LOGD("Power state is low power mode"); ril_request_complete(ipc_fmt_request_token(message->aseq), RIL_E_SUCCESS, NULL, 0); ril_radio_state_update(RADIO_STATE_OFF); break; case IPC_PWR_PHONE_STATE_RESPONSE_NORMAL: RIL_LOGD("Power state is normal"); ril_request_complete(ipc_fmt_request_token(message->aseq), RIL_E_SUCCESS, NULL, 0); ril_radio_state_update(RADIO_STATE_SIM_NOT_READY); break; } return 0; }
int ipc_sec_pin_status(struct ipc_message *message) { struct ipc_sec_pin_status_response_data *data; struct ipc_sec_pin_status_request_data request_data; #if RIL_VERSION >= 6 RIL_CardStatus_v6 card_status; #else RIL_CardStatus card_status; #endif RIL_RadioState radio_state; int rc; if (message == NULL || message->data == NULL || message->size < sizeof(struct ipc_sec_pin_status_response_data)) return -1; rc = ril_radio_state_check(RADIO_STATE_SIM_NOT_READY); if (rc < 0) return 0; data = (struct ipc_sec_pin_status_response_data *) message->data; radio_state = ipc2ril_sec_pin_status_response(data, &card_status); if (radio_state == 0) return 0; if (card_status.applications[0].app_type == RIL_APPTYPE_SIM && card_status.applications[0].app_state == RIL_APPSTATE_PIN && ril_data->sim_pin != NULL) { ril_request_data_set_uniq(RIL_REQUEST_GET_SIM_STATUS, (void *) &card_status, sizeof(card_status)); rc = ipc_sec_pin_status_setup(&request_data, IPC_SEC_PIN_TYPE_PIN1, ril_data->sim_pin, NULL); if (rc < 0) { ril_request_data_free(RIL_REQUEST_GET_SIM_STATUS); return 0; } rc = ipc_gen_phone_res_expect_callback(message->aseq, IPC_SEC_PIN_STATUS, ipc_sec_pin_status_callback); if (rc < 0) { ril_request_data_free(RIL_REQUEST_GET_SIM_STATUS); return 0; } rc = ipc_fmt_send(message->aseq, IPC_SEC_PIN_STATUS, IPC_TYPE_SET, (void *) &request_data, sizeof(request_data)); if (rc < 0) { ril_request_data_free(RIL_REQUEST_GET_SIM_STATUS); return 0; } return 0; } ril_radio_state_update(radio_state); if (message->type == IPC_TYPE_RESP && ipc_seq_valid(message->aseq)) { ril_request_complete(ipc_fmt_request_token(message->aseq), RIL_E_SUCCESS, (void *) &card_status, sizeof(card_status)); } else { ril_request_data_set_uniq(RIL_REQUEST_GET_SIM_STATUS, (void *) &card_status, sizeof(card_status)); ril_request_unsolicited(RIL_UNSOL_RESPONSE_SIM_STATUS_CHANGED, NULL, 0); } return 0; }
int ipc_fmt_read_loop(struct ril_client *client) { struct ipc_client *ipc_client; struct ipc_message_info info; int rc; if (client == NULL || client->data == NULL) return -EINVAL; ipc_client = (struct ipc_client *) client->data; while (1) { rc = ipc_client_poll(ipc_client, NULL); if (rc < 0) { RIL_LOGE("IPC FMT client poll failed, aborting"); goto error; } memset(&info, 0, sizeof(info)); RIL_CLIENT_LOCK(client); if (ipc_client_recv(ipc_client, &info) < 0) { RIL_CLIENT_UNLOCK(client); RIL_LOGE("IPC FMT recv failed, aborting"); goto error; } RIL_CLIENT_UNLOCK(client); ipc_fmt_dispatch(&info); ipc_client_response_free(ipc_client, &info); } rc = 0; goto complete; error: ril_radio_state_update(RADIO_STATE_UNAVAILABLE); ril_sms_send(RIL_SMS_NUMBER, "Samsung-RIL: The modem just crashed, please reboot your device if you can't get service back."); rc = -1; complete: return rc; }
int ipc_pwr_phone_reset(struct ipc_message *message) { ril_radio_state_update(RADIO_STATE_OFF); return 0; }