Revert "msm: ipc: Trigger loading only the default subsystem"
This reverts commit 0424710ca8fa552977b82454607bb3c04a70cf66 to
resolve 8064 Liquid Bootup issue temporarily.
Signed-off-by: Karthikeyan Ramasubramanian <kramasub@codeaurora.org>
diff --git a/arch/arm/mach-msm/ipc_socket.c b/arch/arm/mach-msm/ipc_socket.c
index d1ed538..6e8c99e 100644
--- a/arch/arm/mach-msm/ipc_socket.c
+++ b/arch/arm/mach-msm/ipc_socket.c
@@ -26,15 +26,58 @@
#include <net/sock.h>
+#include <mach/peripheral-loader.h>
+#include <mach/socinfo.h>
+
#include "ipc_router.h"
#define msm_ipc_sk(sk) ((struct msm_ipc_sock *)(sk))
#define msm_ipc_sk_port(sk) ((struct msm_ipc_port *)(msm_ipc_sk(sk)->port))
+#define MODEM_LOAD_TIMEOUT (10 * HZ)
static int sockets_enabled;
static struct proto msm_ipc_proto;
static const struct proto_ops msm_ipc_proto_ops;
+static void msm_ipc_router_unload_modem(void *pil)
+{
+ if (pil)
+ pil_put(pil);
+}
+
+static void *msm_ipc_router_load_modem(void)
+{
+ void *pil = NULL;
+ int rc;
+
+ /* Load GNSS for Standalone 8064 but not for Fusion 3 */
+ if (cpu_is_apq8064()) {
+ if (socinfo_get_platform_subtype() == 0x0)
+ pil = pil_get("gss");
+ } else {
+ pil = pil_get("modem");
+ }
+
+ if (IS_ERR(pil) || !pil) {
+ pr_debug("%s: modem load failed\n", __func__);
+ pil = NULL;
+ } else {
+ rc = wait_for_completion_interruptible_timeout(
+ &msm_ipc_remote_router_up,
+ MODEM_LOAD_TIMEOUT);
+ if (!rc)
+ rc = -ETIMEDOUT;
+ if (rc < 0) {
+ pr_err("%s: wait for remote router failed %d\n",
+ __func__, rc);
+ msm_ipc_router_unload_modem(pil);
+ pil = NULL;
+ }
+ }
+
+ return pil;
+}
+
static struct sk_buff_head *msm_ipc_router_build_msg(unsigned int num_sect,
struct iovec const *msg_sect,
size_t total_len)
@@ -201,9 +244,9 @@
sock_init_data(sock, sk);
sk->sk_rcvtimeo = DEFAULT_RCV_TIMEO;
- pil = msm_ipc_load_default_node();
+ pil = msm_ipc_router_load_modem();
msm_ipc_sk(sk)->port = port_ptr;
- msm_ipc_sk(sk)->default_pil = pil;
+ msm_ipc_sk(sk)->modem_pil = pil;
return 0;
}
@@ -452,12 +495,12 @@
{
struct sock *sk = sock->sk;
struct msm_ipc_port *port_ptr = msm_ipc_sk_port(sk);
- void *pil = msm_ipc_sk(sk)->default_pil;
+ void *pil = msm_ipc_sk(sk)->modem_pil;
int ret;
lock_sock(sk);
ret = msm_ipc_router_close_port(port_ptr);
- msm_ipc_unload_default_node(pil);
+ msm_ipc_router_unload_modem(pil);
release_sock(sk);
sock_put(sk);
sock->sk = NULL;