static int npa_remote_cb(struct msm_rpc_client *client, struct msm_rpc_xdr *xdr) { int err = 0; int array_length = 0; unsigned int status = RPC_ACCEPTSTAT_SYSTEM_ERR; struct npa_remote_cb_data arg; npa_remote_callback cb_fn = NULL; xdr_recv_uint32(xdr, &arg.cb_id); xdr_recv_uint32(xdr, &arg.context); xdr_recv_uint32(xdr, &arg.type); xdr_recv_array(xdr, (void **)&arg.buffer, &array_length, INT_MAX, sizeof(int32_t), (void *)xdr_recv_int32); xdr_recv_uint32(xdr, &arg.size); cb_fn = (npa_remote_callback) msm_rpc_get_cb_func(client, arg.cb_id); if (cb_fn) { cb_fn((void *)arg.context, arg.type, arg.buffer, arg.size); status = RPC_ACCEPTSTAT_SUCCESS; } xdr_start_accepted_reply(xdr, status); err = xdr_send_msg(xdr); if (err) { pr_err("NPA Remote callback %s: send accepted reply failed: " "%d\n", __func__, err); BUG(); } kfree(arg.buffer); return 0; }
static int ping_mdm_data_cb(struct msm_rpc_client *client, struct msm_rpc_xdr *xdr) { int rc; void *cb_func; uint32_t size, accept_status; struct ping_mdm_register_data_cb_cb_arg arg; struct ping_mdm_register_data_cb_cb_ret ret; xdr_recv_uint32(xdr, &arg.cb_id); /* cb_id */ /* data */ xdr_recv_array(xdr, (void **)(&(arg.data)), &size, 64, sizeof(uint32_t), (void *)xdr_recv_uint32); xdr_recv_uint32(xdr, &arg.size); /* size */ xdr_recv_uint32(xdr, &arg.sum); /* sum */ cb_func = msm_rpc_get_cb_func(client, arg.cb_id); if (cb_func) { rc = ((int (*) (struct ping_mdm_register_data_cb_cb_arg *, struct ping_mdm_register_data_cb_cb_ret *)) cb_func)(&arg, &ret); if (rc) accept_status = RPC_ACCEPTSTAT_SYSTEM_ERR; else accept_status = RPC_ACCEPTSTAT_SUCCESS; } else accept_status = RPC_ACCEPTSTAT_SYSTEM_ERR; xdr_start_accepted_reply(xdr, accept_status); if (accept_status == RPC_ACCEPTSTAT_SUCCESS) xdr_send_uint32(xdr, &ret.result); /* result */ rc = xdr_send_msg(xdr); if (rc) pr_err("%s: send accepted reply failed: %d\n", __func__, rc); kfree(arg.data); return rc; }
static int handle_lg_fw_helper_misc_blk_write(struct msm_rpc_xdr *xdr) { int ret; struct lg_fw_helper_misc_blk_rpc arg; // get block number ret = xdr_recv_uint32(xdr, &arg.block_no); if (ret != 0) return ret; // get block data ret = xdr_recv_array(xdr, (void **)&arg.data, &arg.size, 128, sizeof(uint32_t), (void *)xdr_recv_uint32); if (ret != 0) return ret; // write block data print_hex_dump(KERN_INFO, "data: ", DUMP_PREFIX_OFFSET, 16, 1, arg.data, 512, true); printk(KERN_ERR "[sunny] block num = %d \n", arg.block_no); ret = lge_emmc_wallpaper_write(arg.block_no, (unsigned char*) arg.data, 512); ret = xdr_start_accepted_reply(xdr, RPC_ACCEPTSTAT_SUCCESS); if (ret != 0) goto handle_lg_fw_helper_misc_blk_write_exit; ret = 0xabcdef12; // for debugging ret = xdr_send_uint32(xdr, &ret); if (ret != 0) goto handle_lg_fw_helper_misc_blk_write_exit; ret = xdr_send_msg(xdr); if (ret < 0) pr_err("%s: sending reply failed\n", __func__); handle_lg_fw_helper_misc_blk_write_exit: if (arg.data) kfree(arg.data); return 0; }