diff options
author | Denis Kenzior <denkenz@gmail.com> | 2017-10-03 18:29:56 -0500 |
---|---|---|
committer | Denis Kenzior <denkenz@gmail.com> | 2017-10-05 11:08:38 -0500 |
commit | c995e657f47e6fdb7afe809d4232e6e380255c86 (patch) | |
tree | c462127c8882da78a55c3972fb35384105956019 /drivers/mbimmodem/mbim.c | |
parent | 65d6d7d199f6cd0beb912ca97e2aff5de5ad00a9 (diff) | |
download | ofono-c995e657f47e6fdb7afe809d4232e6e380255c86.tar.gz |
mbim: Close IO in an idle event
Diffstat (limited to 'drivers/mbimmodem/mbim.c')
-rw-r--r-- | drivers/mbimmodem/mbim.c | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/drivers/mbimmodem/mbim.c b/drivers/mbimmodem/mbim.c index 019c41d6..1e71a396 100644 --- a/drivers/mbimmodem/mbim.c +++ b/drivers/mbimmodem/mbim.c @@ -215,6 +215,7 @@ struct mbim_device { size_t header_offset; size_t segment_bytes_remaining; struct message_assembly *assembly; + struct l_idle *close_io; bool is_ready : 1; }; @@ -390,6 +391,18 @@ static bool close_write_handler(struct l_io *io, void *user_data) return false; } +static void close_io(struct l_idle *idle, void *user_data) +{ + struct mbim_device *device = user_data; + struct l_io *io = device->io; + + l_idle_remove(idle); + device->close_io = NULL; + + device->io = NULL; + l_io_destroy(io); +} + static bool close_read_handler(struct l_io *io, void *user_data) { struct mbim_device *device = user_data; @@ -439,8 +452,7 @@ static bool close_read_handler(struct l_io *io, void *user_data) device->header_offset = 0; if (type == MBIM_CLOSE_DONE) { - l_io_destroy(io); - device->io = NULL; + device->close_io = l_idle_create(close_io, device, NULL); return false; } @@ -494,6 +506,8 @@ void mbim_device_unref(struct mbim_device *device) if (__sync_sub_and_fetch(&device->ref_count, 1)) return; + l_idle_remove(device->close_io); + if (device->io) { l_io_destroy(device->io); device->io = NULL; |