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;
}
Esempio n. 3
0
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;
}