Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5e4dbce2 authored by Sai Chaitanya Kaveti's avatar Sai Chaitanya Kaveti
Browse files

msm: mhi_dev: Support async write in UCI for size greater than 8k



In the current implementation of MHI UCI layer, write operation from
device to host fails if the size requested by client is more than 8k.
Removing this condition in this change as MHI supports buffer size of
upto 64k in async path. Continuing to fail write in sync case, as MHI
layer uses pre allocated buffers of size 8k. Also, added debug logs to
check if buffer size of Diag is more than 16k. With this change async
writes of size greater than 8k are supported in UCI layer.

Change-Id: I084da6a49a00095e806872f591365eabb9edc1de
Signed-off-by: default avatarSai Chaitanya Kaveti <quic_skaveti@quicinc.com>
parent 17edd981
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -267,6 +267,7 @@ struct mhi_config {
#define MHI_ENV_VALUE			2
#define MHI_MASK_ROWS_CH_EV_DB		4
#define TRB_MAX_DATA_SIZE		8192
#define TRB_MAX_DATA_SIZE_16K		16384
#define MHI_CTRL_STATE			100

/* maximum transfer completion events buffer */
+19 −14
Original line number Diff line number Diff line
@@ -173,7 +173,7 @@ static const struct chan_attr mhi_chan_attr_table[] = {
	},
	{
		MHI_CLIENT_DIAG_OUT,
		TRB_MAX_DATA_SIZE,
		TRB_MAX_DATA_SIZE_16K,
		MAX_NR_TRBS_PER_CHAN,
		MHI_DIR_OUT,
		NULL,
@@ -184,7 +184,7 @@ static const struct chan_attr mhi_chan_attr_table[] = {
	},
	{
		MHI_CLIENT_DIAG_IN,
		TRB_MAX_DATA_SIZE,
		TRB_MAX_DATA_SIZE_16K,
		MAX_NR_TRBS_PER_CHAN,
		MHI_DIR_IN,
		NULL,
@@ -629,10 +629,17 @@ static int mhi_uci_send_sync(struct uci_client *uci_handle,
	struct mhi_req ureq;
	int ret_val;

	uci_log(UCI_DBG_VERBOSE,
	uci_log(UCI_DBG_DBG,
		"Sync write for ch_id:%d size %d\n",
		uci_handle->out_chan, size);

	if (size > TRB_MAX_DATA_SIZE) {
		uci_log(UCI_DBG_ERROR,
				"Too big write size: %lu, max supported size is %d\n",
				size, TRB_MAX_DATA_SIZE);
			return -EFBIG;
	}

	ureq.client = uci_handle->out_handle;
	ureq.buf = data_loc;
	ureq.len = size;
@@ -945,7 +952,7 @@ static int mhi_uci_read_sync(struct uci_client *uci_handle, int *bytes_avail)
	struct mhi_req ureq;
	struct mhi_dev_client *client_handle;

	uci_log(UCI_DBG_INFO,
	uci_log(UCI_DBG_DBG,
		"Sync read for ch_id:%d\n", uci_handle->in_chan);

	client_handle = uci_handle->in_handle;
@@ -1484,11 +1491,10 @@ static ssize_t mhi_uci_client_write(struct file *file,
		return -ENODEV;
	}

	if (count > TRB_MAX_DATA_SIZE) {
		uci_log(UCI_DBG_ERROR,
			"Too big write size: %lu, max supported size is %d\n",
			count, TRB_MAX_DATA_SIZE);
		return -EFBIG;
	if (count > uci_handle->out_chan_attr->max_packet_size) {
		uci_log(UCI_DBG_DBG,
			"Warning: big write size: %lu, max supported size is %d\n",
			count, uci_handle->out_chan_attr->max_packet_size);
	}

	data_loc = kmalloc(count, GFP_KERNEL);
@@ -1543,11 +1549,10 @@ static ssize_t mhi_uci_client_write_iter(struct kiocb *iocb,
		return -ENODEV;
	}

	if (count > TRB_MAX_DATA_SIZE) {
		uci_log(UCI_DBG_ERROR,
			"Too big write size: %lu, max supported size is %d\n",
			count, TRB_MAX_DATA_SIZE);
		return -EFBIG;
	if (count > uci_handle->out_chan_attr->max_packet_size) {
		uci_log(UCI_DBG_DBG,
			"Warning: big write size: %lu, max supported size is %d\n",
			count, uci_handle->out_chan_attr->max_packet_size);
	}

	data_loc = kmalloc(count, GFP_KERNEL);