2 * This file is part of hayes-ril.
4 * Copyright (C) 2012 Paul Kocialkowski <contact@paulk.fr>
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
21 #define LOG_TAG "RIL-DEV"
22 #include <utils/Log.h>
24 #include <hayes-ril.h>
30 int ril_device_init(struct ril_device *ril_device_p)
34 rc = ril_device_data_create(ril_device_p);
36 LOGE("Failed to create device data!");
40 rc = ril_device_power_on(ril_device_p);
42 LOGE("Failed to power on device!");
46 rc = ril_device_power_boot(ril_device_p);
48 LOGE("Failed to boot device!");
52 rc = ril_device_transport_open(ril_device_p);
54 LOGE("Failed to open device!");
61 int ril_device_deinit(struct ril_device *ril_device_p)
63 ril_device_transport_close(ril_device_p);
65 ril_device_power_off(ril_device_p);
67 ril_device_data_destroy(ril_device_p);
72 int ril_device_data_create(struct ril_device *ril_device_p)
76 if(ril_device_p->handlers == NULL) {
77 LOGE("Missing device handlers!");
81 if(ril_device_p->handlers->power == NULL) {
82 LOGE("Missing device power handlers!");
86 if(ril_device_p->handlers->power->sdata_create == NULL) {
87 LOGE("Missing device power data handlers!");
91 LOGD("Creating data for power handlers...");
92 rc = ril_device_p->handlers->power->sdata_create(&ril_device_p->handlers->power->sdata);
94 LOGE("Creating data for power handlers failed!");
98 if(ril_device_p->handlers->transport == NULL) {
99 LOGE("Missing device transport handlers!");
103 if(ril_device_p->handlers->transport->sdata_create == NULL) {
104 LOGE("Missing device transport data handlers!");
108 LOGD("Creating data for transport handlers...");
109 ril_device_p->handlers->transport->sdata_create(&ril_device_p->handlers->transport->sdata);
111 LOGE("Creating data for transport handlers failed!");
115 LOGD("Creating mutex for transport handlers...");
116 pthread_mutex_init(&(ril_device_p->handlers->transport->mutex), NULL);
121 int ril_device_data_destroy(struct ril_device *ril_device_p)
125 if(ril_device_p->handlers == NULL) {
126 LOGE("Missing device handlers!");
130 if(ril_device_p->handlers->power == NULL) {
131 LOGE("Missing device power handlers!");
135 if(ril_device_p->handlers->power->sdata_destroy == NULL) {
136 LOGE("Missing device power data handlers!");
140 LOGD("Destroying data for power handlers...");
141 rc = ril_device_p->handlers->power->sdata_destroy(ril_device_p->handlers->power->sdata);
143 LOGE("Destroying data for power handlers failed!");
147 if(ril_device_p->handlers->transport == NULL) {
148 LOGE("Missing device transport handlers!");
152 if(ril_device_p->handlers->transport->sdata_destroy == NULL) {
153 LOGE("Missing device transport data handlers!");
157 LOGD("Destroying data for transport handlers...");
158 ril_device_p->handlers->transport->sdata_destroy(ril_device_p->handlers->transport->sdata);
160 LOGE("Destroying data for transport handlers failed!");
164 LOGD("Destroying mutex for transport handlers...");
165 pthread_mutex_destroy(&(ril_device_p->handlers->transport->mutex));
174 int ril_device_power_on(struct ril_device *ril_device_p)
178 if(ril_device_p->handlers == NULL) {
179 LOGE("Missing device handlers!");
183 if(ril_device_p->handlers->power == NULL) {
184 LOGE("Missing device power handlers!");
188 if(ril_device_p->handlers->power->power_on == NULL) {
189 LOGE("Missing device power on handler!");
193 LOGD("Powering modem on...");
195 rc = ril_device_p->handlers->power->power_on(ril_device_p->handlers->power->sdata);
199 int ril_device_power_off(struct ril_device *ril_device_p)
203 if(ril_device_p->handlers == NULL) {
204 LOGE("Missing device handlers!");
208 if(ril_device_p->handlers->power == NULL) {
209 LOGE("Missing device power handlers!");
213 if(ril_device_p->handlers->power->power_off == NULL) {
214 LOGE("Missing device power off handler!");
218 LOGD("Powering modem off...");
220 rc = ril_device_p->handlers->power->power_off(ril_device_p->handlers->power->sdata);
224 int ril_device_power_boot(struct ril_device *ril_device_p)
228 if(ril_device_p->handlers == NULL) {
229 LOGE("Missing device handlers!");
233 if(ril_device_p->handlers->power == NULL) {
234 LOGE("Missing device power handlers!");
238 if(ril_device_p->handlers->power->boot == NULL) {
239 LOGE("Missing device power boot handler!");
243 LOGD("Booting modem...");
245 rc = ril_device_p->handlers->power->boot(ril_device_p->handlers->power->sdata);
254 int ril_device_transport_open(struct ril_device *ril_device_p)
258 if(ril_device_p->handlers == NULL) {
259 LOGE("Missing device handlers!");
263 if(ril_device_p->handlers->transport == NULL) {
264 LOGE("Missing device transport handlers!");
268 if(ril_device_p->handlers->transport->open == NULL) {
269 LOGE("Missing device transport open handler!");
273 LOGD("Opening modem...");
275 rc = ril_device_p->handlers->transport->open(ril_device_p->handlers->transport->sdata);
279 int ril_device_transport_close(struct ril_device *ril_device_p)
283 if(ril_device_p->handlers == NULL) {
284 LOGE("Missing device handlers!");
288 if(ril_device_p->handlers->transport == NULL) {
289 LOGE("Missing device transport handlers!");
293 if(ril_device_p->handlers->transport->close == NULL) {
294 LOGE("Missing device transport close handler!");
298 LOGD("Closing modem...");
300 rc = ril_device_p->handlers->transport->close(ril_device_p->handlers->transport->sdata);
304 int ril_device_transport_send(struct ril_device *ril_device_p, void *data, int length)
308 if(ril_device_p->handlers == NULL) {
309 LOGE("Missing device handlers!");
313 if(ril_device_p->handlers->transport == NULL) {
314 LOGE("Missing device transport handlers!");
318 if(ril_device_p->handlers->transport->send == NULL) {
319 LOGE("Missing device transport send handler!");
323 RIL_DEVICE_LOCK(ril_device_p);
324 rc = ril_device_p->handlers->transport->send(ril_device_p->handlers->transport->sdata, data, length);
325 RIL_DEVICE_UNLOCK(ril_device_p);
330 int ril_device_transport_recv(struct ril_device *ril_device_p, void **data, int length)
334 if(ril_device_p->handlers == NULL) {
335 LOGE("Missing device handlers!");
339 if(ril_device_p->handlers->transport == NULL) {
340 LOGE("Missing device transport handlers!");
344 if(ril_device_p->handlers->transport->recv == NULL) {
345 LOGE("Missing device transport recv handler!");
349 RIL_DEVICE_LOCK(ril_device_p);
350 rc = ril_device_p->handlers->transport->recv(ril_device_p->handlers->transport->sdata, data, length);
351 RIL_DEVICE_UNLOCK(ril_device_p);
356 int ril_device_transport_recv_poll(struct ril_device *ril_device_p)
360 if(ril_device_p->handlers == NULL) {
361 LOGE("Missing device handlers!");
365 if(ril_device_p->handlers->transport == NULL) {
366 LOGE("Missing device transport handlers!");
370 if(ril_device_p->handlers->transport->recv_poll == NULL) {
371 LOGE("Missing device transport recv poll handler!");
375 rc = ril_device_p->handlers->transport->recv_poll(ril_device_p->handlers->transport->sdata);
379 int ril_device_transport_recv_loop(struct ril_device *ril_device_p)
381 struct at_response **responses = NULL;
382 int responses_count = 0;
383 int responses_queued = 0;
390 // Return error after 5 consecutive poll/read failures
391 for(i=5 ; i > 0 ; i--) {
393 rc = ril_device_transport_recv_poll(ril_device_p);
395 LOGE("Polling from transport recv failed!");
401 rc = ril_device_transport_recv(ril_device_p, &data, length);
402 if(rc <= 0 || data == NULL) {
403 LOGE("Reading from transport recv failed!");
413 responses_count = at_responses_process(&responses, data, length);
414 responses_queued = 0;
418 ril_data_log(data, length);
421 // Good way to give the recv loop some sleep: call at_send_expect_status
422 for(j=0 ; j < responses_count ; j++) {
425 ril_recv_log(responses[j]);
429 rc = at_sync_response_dequeue(responses[j]);
431 rc = at_response_queue(responses[j]);
433 LOGE("Failed to queue response, clearing!");
434 at_response_free(responses[j]);
436 responses_queued = 1;
441 // Unlock the queue after adding all the requests to the queue (if any)
443 at_responses_queue_unlock();
448 // When poll/read failed, close and reopen the device
449 ril_device_transport_close(ril_device_p);
451 ril_device_transport_open(ril_device_p);
453 RIL_DEVICE_UNLOCK(ril_device_p);
459 void *ril_device_transport_recv_thread(void *data)
461 struct ril_device *ril_device_p = (struct ril_device *) data;
465 for(i = 5 ; i > 0 ; i--) {
466 rc = ril_device_transport_recv_loop(ril_device_p);
468 LOGE("Recv loop failed too many times, restarting...");
470 rc = ril_device_deinit(ril_device_p);
476 rc = ril_device_init(ril_device_p);
482 LOGE("Recv thread failed too many times, stopping it all...");
483 ril_device_deinit(ril_device_p);
488 int ril_device_transport_recv_thread_start(struct ril_device *ril_device_p)
493 if(ril_device_p->handlers == NULL) {
494 LOGE("Missing device handlers!");
498 if(ril_device_p->handlers->transport == NULL) {
499 LOGE("Missing device transport handlers!");
503 pthread_attr_init(&attr);
504 pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
506 rc = pthread_create(&(ril_device_p->handlers->transport->recv_thread), &attr, ril_device_transport_recv_thread, (void *) ril_device_p);
508 LOGE("Creating transport recv thread failed!");