diff options
author | Simon Busch <morphis@gravedo.de> | 2012-08-27 12:28:21 +0200 |
---|---|---|
committer | Simon Busch <morphis@gravedo.de> | 2012-08-27 12:28:21 +0200 |
commit | aae7f36e70d164eaf4917281f816891807c37d27 (patch) | |
tree | 59350f68fb0f2c07e967ddcdb560216b5ec77e6a /samsung-ipc | |
parent | d851f2bceb5813ba128ab31384bbec7f8cc72f07 (diff) | |
parent | a6b8e7d405b16b33a9726ddd70346b5dbb6c845a (diff) | |
download | external_libsamsung-ipc-aae7f36e70d164eaf4917281f816891807c37d27.zip external_libsamsung-ipc-aae7f36e70d164eaf4917281f816891807c37d27.tar.gz external_libsamsung-ipc-aae7f36e70d164eaf4917281f816891807c37d27.tar.bz2 |
Merge remote-tracking branch 'astarasikov/merge-24-aug'
Conflicts:
include/Makefile.am
Diffstat (limited to 'samsung-ipc')
-rw-r--r-- | samsung-ipc/Makefile.am | 1 | ||||
-rw-r--r-- | samsung-ipc/device/crespo/crespo_ipc.c | 36 | ||||
-rw-r--r-- | samsung-ipc/device/crespo/crespo_ipc.h | 3 | ||||
-rw-r--r-- | samsung-ipc/device/maguro/maguro_ipc.c | 2 | ||||
-rw-r--r-- | samsung-ipc/device/maguro/maguro_loader.c | 24 | ||||
-rw-r--r-- | samsung-ipc/device/maguro/maguro_loader.h | 3 | ||||
-rw-r--r-- | samsung-ipc/device/xmm6260/xmm6260_ipc.c | 49 | ||||
-rw-r--r-- | samsung-ipc/ipc.c | 4 | ||||
-rw-r--r-- | samsung-ipc/wakelock.c | 60 |
9 files changed, 135 insertions, 47 deletions
diff --git a/samsung-ipc/Makefile.am b/samsung-ipc/Makefile.am index bf3cecb..6f7c380 100644 --- a/samsung-ipc/Makefile.am +++ b/samsung-ipc/Makefile.am @@ -26,6 +26,7 @@ libsamsung_ipc_la_SOURCES = \ gprs.c \ call.c \ net.c \ + wakelock.c \ ipc_private.h \ ipc_devices.h \ device/crespo/crespo_ipc.c \ diff --git a/samsung-ipc/device/crespo/crespo_ipc.c b/samsung-ipc/device/crespo/crespo_ipc.c index 34a2000..33386d9 100644 --- a/samsung-ipc/device/crespo/crespo_ipc.c +++ b/samsung-ipc/device/crespo/crespo_ipc.c @@ -34,38 +34,12 @@ #include <assert.h> #include <radio.h> +#include <wakelock.h> #include "crespo_modem_ctl.h" #include "crespo_ipc.h" #include "ipc_private.h" -int wake_lock_fd = -1; -int wake_unlock_fd = -1; - -int wake_lock(char *lock_name, int len) -{ - int rc = 0; - - if(wake_lock_fd < 0) - wake_lock_fd = open("/sys/power/wake_lock", O_RDWR); - - rc = write(wake_lock_fd, lock_name, len); - - return rc; -} - -int wake_unlock(char *lock_name, int len) -{ - int rc = 0; - - if(wake_unlock_fd < 0) - wake_unlock_fd = open("/sys/power/wake_unlock", O_RDWR); - - rc = write(wake_unlock_fd, lock_name, len); - - return rc; -} - int crespo_modem_bootstrap(struct ipc_client *client) { int s3c2410_serial3_fd = -1; @@ -388,7 +362,7 @@ int crespo_ipc_fmt_client_recv(struct ipc_client *client, struct ipc_message_inf memset(response, 0, sizeof(struct ipc_message_info)); - wake_lock("secril_fmt-interface", 20); + wake_lock("secril_fmt-interface"); assert(client->handlers->read != NULL); bread = client->handlers->read((uint8_t*) &modem_data, sizeof(struct modem_io) + MAX_MODEM_DATA_SIZE, client->handlers->read_data); @@ -425,7 +399,7 @@ int crespo_ipc_fmt_client_recv(struct ipc_client *client, struct ipc_message_inf ipc_client_log_recv(client, response, __func__); - wake_unlock("secril_fmt-interface", 20); + wake_unlock("secril_fmt-interface"); return 0; } @@ -441,7 +415,7 @@ int crespo_ipc_rfs_client_recv(struct ipc_client *client, struct ipc_message_inf memset(response, 0, sizeof(struct ipc_message_info)); - wake_lock("secril_rfs-interface", 20); + wake_lock("secril_rfs-interface"); assert(client->handlers->read != NULL); bread = client->handlers->read((uint8_t*) &modem_data, sizeof(struct modem_io) + MAX_MODEM_DATA_SIZE, client->handlers->read_data); @@ -475,7 +449,7 @@ int crespo_ipc_rfs_client_recv(struct ipc_client *client, struct ipc_message_inf ipc_client_log_recv(client, response, __func__); - wake_unlock("secril_rfs-interface", 20); + wake_unlock("secril_rfs-interface"); return 0; } diff --git a/samsung-ipc/device/crespo/crespo_ipc.h b/samsung-ipc/device/crespo/crespo_ipc.h index 2cc6ef3..47c8da8 100644 --- a/samsung-ipc/device/crespo/crespo_ipc.h +++ b/samsung-ipc/device/crespo/crespo_ipc.h @@ -30,9 +30,6 @@ #define GPRS_IFACE_PREFIX "rmnet" -int wake_lock(char *lock_name, int len); -int wake_unlock(char *lock_name, int len); - extern struct ipc_handlers crespo_ipc_default_handlers; #endif diff --git a/samsung-ipc/device/maguro/maguro_ipc.c b/samsung-ipc/device/maguro/maguro_ipc.c index fb4121d..19b5ba4 100644 --- a/samsung-ipc/device/maguro/maguro_ipc.c +++ b/samsung-ipc/device/maguro/maguro_ipc.c @@ -48,7 +48,7 @@ struct ipc_handlers maguro_default_handlers = { .open = xmm6260_ipc_open, .close = xmm6260_ipc_close, .power_on = xmm6260_ipc_power_on, - .power_off = xmm6260_ipc_power_off, + .power_off = maguro_power_off, .common_data = NULL, .common_data_create = xmm6260_ipc_common_data_create, .common_data_destroy = xmm6260_ipc_common_data_destroy, diff --git a/samsung-ipc/device/maguro/maguro_loader.c b/samsung-ipc/device/maguro/maguro_loader.c index 565c605..84de38d 100644 --- a/samsung-ipc/device/maguro/maguro_loader.c +++ b/samsung-ipc/device/maguro/maguro_loader.c @@ -628,6 +628,28 @@ fail: return ret; } +int maguro_power_off(void *io_data_unused) { + int ret = -1; + struct modemctl_io_data io_data; + + io_data.boot_fd = open(BOOT_DEV, O_RDWR | O_NOCTTY | O_NONBLOCK); + if (io_data.boot_fd < 0) { + ret = io_data.boot_fd; + goto fail; + } + + if ((ret = modemctl_modem_power(NULL, &io_data, false)) < 0) { + goto fail_pwr; + } + + ret = 0; + +fail_pwr: + close(io_data.boot_fd); +fail: + return ret; +} + int maguro_modem_bootstrap(struct ipc_client *client) { int ret = -1; @@ -708,7 +730,7 @@ int maguro_modem_bootstrap(struct ipc_client *client) goto fail; } ipc_client_log(client, "got bootloader reply %08x", id_buf); - if (id_buf == I9250_BOOT_LAST_MARKER) { + if ((id_buf & I9250_BOOT_LAST_MASK) == I9250_BOOT_LAST_MASK) { ret = 0; break; } diff --git a/samsung-ipc/device/maguro/maguro_loader.h b/samsung-ipc/device/maguro/maguro_loader.h index 7a47635..e8bb448 100644 --- a/samsung-ipc/device/maguro/maguro_loader.h +++ b/samsung-ipc/device/maguro/maguro_loader.h @@ -30,7 +30,7 @@ #define I9250_RADIO_IMAGE "/dev/block/platform/omap/omap_hsmmc.0/by-name/radio" #define I9250_SECOND_BOOT_DEV "/dev/umts_boot1" -#define I9250_BOOT_LAST_MARKER 0x0030ffff +#define I9250_BOOT_LAST_MASK 0x0000ffff #define I9250_BOOT_REPLY_MAX 20 #define I9250_GENERAL_ACK "\x02\x00\x00\x00" @@ -98,6 +98,7 @@ struct maguro_boot_tail_header name = {\ } int maguro_modem_bootstrap(struct ipc_client *client); +int maguro_power_off(void *io_data); #endif diff --git a/samsung-ipc/device/xmm6260/xmm6260_ipc.c b/samsung-ipc/device/xmm6260/xmm6260_ipc.c index 8364ffc..b438c5d 100644 --- a/samsung-ipc/device/xmm6260/xmm6260_ipc.c +++ b/samsung-ipc/device/xmm6260/xmm6260_ipc.c @@ -38,6 +38,7 @@ #include <assert.h> #include <radio.h> +#include <wakelock.h> #include "ipc_private.h" @@ -46,12 +47,17 @@ #include "xmm6260_modemctl.h" #include "modem_prj.h" +#define FMT_LOCK_NAME "xmm6260-fmt-lock" +#define RFS_LOCK_NAME "xmm6260-rfs-lock" + int xmm6260_ipc_fmt_client_send(struct ipc_client *client, struct ipc_message_info *request) { struct ipc_header *hdr; unsigned char *frame; unsigned char *payload; size_t frame_length; + + wake_lock(FMT_LOCK_NAME); /* Frame IPC header + payload length */ frame_length = (sizeof(*hdr) + request->length); @@ -77,6 +83,8 @@ int xmm6260_ipc_fmt_client_send(struct ipc_client *client, struct ipc_message_in free(frame); + wake_unlock(FMT_LOCK_NAME); + return 0; } @@ -92,14 +100,19 @@ int xmm6260_ipc_fmt_client_recv(struct ipc_client *client, struct ipc_message_in int num_read = 0; int left = 0; + if (!client || !response) + return -1; + + wake_lock(FMT_LOCK_NAME); + num_read = client->handlers->read(buf, IPC_MAX_XFER, client->handlers->read_data); - if (num_read < 0) { + if (num_read <= 0) { ipc_client_log(client, "read failed to read ipc length: %d", num_read); response->data = 0; response->length = 0; - return 0; + goto done; } memcpy(&ipc, buf, sizeof(ipc)); @@ -119,12 +132,16 @@ int xmm6260_ipc_fmt_client_recv(struct ipc_client *client, struct ipc_message_in response->type = ipc.type; response->cmd = IPC_COMMAND(response); response->length = ipc.length - sizeof(ipc); - - response->data = (unsigned char*)malloc(response->length); - memcpy(response->data, buf + sizeof(ipc), response->length); + + if (response->length > 0) { + response->data = (unsigned char*)malloc(response->length); + memcpy(response->data, buf + sizeof(ipc), response->length); + } ipc_client_log_recv(client, response, __func__); +done: + wake_unlock(FMT_LOCK_NAME); return 0; } @@ -136,12 +153,17 @@ int xmm6260_ipc_rfs_client_recv(struct ipc_client *client, struct ipc_message_in unsigned count=0; int rc; + int ret = 0; + + wake_lock(RFS_LOCK_NAME); + do { rc = client->handlers->read(buf, IPC_MAX_XFER, client->handlers->read_data); if (rc < 0) { ipc_client_log(client, "Failed to read RFS data."); - return -1; + ret = -1; + goto done; } ipc_client_log(client, "received %d bytes", rc); @@ -149,14 +171,16 @@ int xmm6260_ipc_rfs_client_recv(struct ipc_client *client, struct ipc_message_in if (!header_recv) { if ((unsigned)rc < sizeof(struct rfs_hdr)) { ipc_client_log(client, "Failed to read RFS data."); - return -1; + ret = -1; + goto done; } memcpy((void *) &header, (void *) buf, sizeof(struct rfs_hdr)); if (header.size < sizeof(struct rfs_hdr)) { ipc_client_log(client, "Invalid size in header"); - return -1; + ret = -1; + goto done; } response->mseq = 0; @@ -185,7 +209,10 @@ int xmm6260_ipc_rfs_client_recv(struct ipc_client *client, struct ipc_message_in ipc_client_log_recv(client, response, __func__); - return 0; +done: + + wake_unlock(RFS_LOCK_NAME); + return ret; } int xmm6260_ipc_rfs_client_send(struct ipc_client *client, struct ipc_message_info *request) @@ -195,6 +222,8 @@ int xmm6260_ipc_rfs_client_send(struct ipc_client *client, struct ipc_message_in int data_length; int rc; + wake_lock(RFS_LOCK_NAME); + data_length = sizeof(struct rfs_hdr) + request->length; data = malloc(data_length); memset(data, 0, data_length); @@ -209,6 +238,8 @@ int xmm6260_ipc_rfs_client_send(struct ipc_client *client, struct ipc_message_in ipc_client_log_send(client, request, __func__); rc = client->handlers->write(data, data_length, client->handlers->write_data); + + wake_unlock(RFS_LOCK_NAME); return rc; } diff --git a/samsung-ipc/ipc.c b/samsung-ipc/ipc.c index 91dbf15..993a3ab 100644 --- a/samsung-ipc/ipc.c +++ b/samsung-ipc/ipc.c @@ -48,7 +48,9 @@ void log_handler_default(const char *message, void *user_data) void ipc_client_log(struct ipc_client *client, const char *message, ...) { - assert(client->log_handler != NULL); + if (!message || !client || !client->log_handler) { + return; + } va_list args; char buffer[4096]; diff --git a/samsung-ipc/wakelock.c b/samsung-ipc/wakelock.c new file mode 100644 index 0000000..1daaec9 --- /dev/null +++ b/samsung-ipc/wakelock.c @@ -0,0 +1,60 @@ +/** + * This file is part of libsamsung-ipc. + * + * Copyright (C) 2012 Alexander Tarasikov <alexander.tarasikov@gmail.com> + * + * libsamsung-ipc is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * libsamsung-ipc is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with libsamsung-ipc. If not, see <http://www.gnu.org/licenses/>. + * + */ + +#include <assert.h> +#include <fcntl.h> +#include <wakelock.h> + +static int wake_lock_fd = -1; +static int wake_unlock_fd = -1; + +int wake_lock(char *lock_name) { + int rc; + assert(lock_name != NULL); + + if (wake_lock_fd < 0) { + wake_lock_fd = open("/sys/power/wake_lock", O_RDWR); + } + + if (wake_lock_fd < 0) { + return wake_lock_fd; + } + + rc = write(wake_lock_fd, lock_name, strlen(lock_name)); + + return rc; +} + +int wake_unlock(char *lock_name) { + int rc; + assert(lock_name != NULL); + + if (wake_unlock_fd < 0) { + wake_unlock_fd = open("/sys/power/wake_unlock", O_RDWR); + } + + if (wake_unlock_fd < 0) { + return wake_lock_fd; + } + + rc = write(wake_unlock_fd, lock_name, strlen(lock_name)); + + return rc; +} |