qmimodem: sync the modem on enable

The qmi sync call release all previous resources.
This commit is contained in:
Alexander Couzens 2017-07-25 20:36:00 +02:00
parent 79418076b5
commit 32dac2f677
3 changed files with 62 additions and 2 deletions

View File

@ -1323,6 +1323,53 @@ bool qmi_device_shutdown(struct qmi_device *device, qmi_shutdown_func_t func,
return true;
}
struct sync_data {
qmi_sync_func_t func;
void *user_data;
};
static void qmi_device_sync_callback(uint16_t message, uint16_t length,
const void *buffer, void *user_data)
{
struct sync_data *data = user_data;
if(data->func)
data->func(data->user_data);
g_free(data);
}
/* sync will release all previous clients */
bool qmi_device_sync(struct qmi_device *device,
qmi_sync_func_t func, void *user_data)
{
struct qmi_request *req;
struct qmi_control_hdr *hdr;
struct sync_data *func_data;
if (!device)
return false;
func_data = g_new0(struct sync_data, 1);
func_data->func = func;
func_data->user_data = user_data;
req = __request_alloc(QMI_SERVICE_CONTROL, 0x00,
QMI_CTL_SYNC, QMI_CONTROL_HDR_SIZE,
NULL, 0,
qmi_device_sync_callback, func_data, (void **) &hdr);
if (device->next_control_tid < 1)
device->next_control_tid = 1;
hdr->type = 0x00;
hdr->transaction = device->next_control_tid++;
__request_submit(device, req, hdr->transaction);
return true;
}
static bool get_device_file_name(struct qmi_device *device,
char *file_name, int size)
{

View File

@ -76,7 +76,7 @@ typedef void (*qmi_destroy_func_t)(void *user_data);
struct qmi_device;
typedef void (*qmi_debug_func_t)(const char *str, void *user_data);
typedef void (*qmi_sync_func_t)(void *user_data);
typedef void (*qmi_shutdown_func_t)(void *user_data);
typedef void (*qmi_discover_func_t)(uint8_t count,
const struct qmi_version *list, void *user_data);
@ -96,6 +96,9 @@ bool qmi_device_discover(struct qmi_device *device, qmi_discover_func_t func,
bool qmi_device_shutdown(struct qmi_device *device, qmi_shutdown_func_t func,
void *user_data, qmi_destroy_func_t destroy);
bool qmi_device_sync(struct qmi_device *device,
qmi_sync_func_t func, void *user_data);
enum qmi_device_expected_data_format qmi_device_get_expected_data_format(
struct qmi_device *device);
bool qmi_device_set_expected_data_format(struct qmi_device *device,

View File

@ -318,6 +318,16 @@ static void discover_cb(uint8_t count, const struct qmi_version *list,
create_dms_cb, modem, NULL);
}
static void sync_cb(void *user_data)
{
struct ofono_modem *modem = user_data;
struct gobi_data *data = ofono_modem_get_data(modem);
DBG("modem in sync");
qmi_device_discover(data->device, discover_cb, modem, NULL);
}
static int gobi_enable(struct ofono_modem *modem)
{
struct gobi_data *data = ofono_modem_get_data(modem);
@ -345,7 +355,7 @@ static int gobi_enable(struct ofono_modem *modem)
qmi_device_set_close_on_unref(data->device, true);
qmi_device_discover(data->device, discover_cb, modem, NULL);
qmi_device_sync(data->device, sync_cb, modem);
return -EINPROGRESS;
}