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

Commit 057e4755 authored by Mayank Rana's avatar Mayank Rana
Browse files

USB: rndis: Honor dl_max_packet_size value sent by host



This change starts using dl_max_packet_size value sent by host
as part of USB RNDIS init message communication. Using default
dl_max_packet_size value results into low throughput with more
data loss on host side as host side RNDIS can't support
de-aggregation (applicable for Linux Host RNDIS driver) or it
ignores received more data then host side RNDIS can handle. To
use fine tune dl_max_packet_size for better throughput, driver
selects minimum value between host supported dl_max_packet_size
and default size (i.e. 9216 bytes as RNDIS IN aggregation size).

Change-Id: I00c81bc905a032867c537536b01bf32584c37e63
Signed-off-by: default avatarMayank Rana <mrana@codeaurora.org>
parent f5d98565
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -1565,12 +1565,22 @@ static void gsi_rndis_command_complete(struct usb_ep *ep,
		struct usb_request *req)
{
	struct f_gsi *gsi = req->context;
	rndis_init_msg_type *buf;
	int status;

	status = rndis_msg_parser(gsi->params, (u8 *) req->buf);
	if (status < 0)
		log_event_err("RNDIS command error %d, %d/%d",
			status, req->actual, req->length);

	buf = (rndis_init_msg_type *)req->buf;
	if (buf->MessageType == RNDIS_MSG_INIT) {
		gsi->d_port.in_aggr_size = min_t(u32, gsi->d_port.in_aggr_size,
						gsi->params->dl_max_xfer_size);
		log_event_dbg("RNDIS host dl_aggr_size:%d in_aggr_size:%d\n",
				gsi->params->dl_max_xfer_size,
				gsi->d_port.in_aggr_size);
	}
}

static void
+11 −2
Original line number Diff line number Diff line
@@ -813,8 +813,17 @@ int rndis_msg_parser(struct rndis_params *params, u8 *buf)
	/* For USB: responses may take up to 10 seconds */
	switch (MsgType) {
	case RNDIS_MSG_INIT:
		pr_debug("%s: RNDIS_MSG_INIT\n",
			__func__);
		pr_debug("%s: RNDIS_MSG_INIT\n", __func__);
		tmp++; /* to get RequestID */
		params->host_rndis_major_ver = get_unaligned_le32(tmp++);
		params->host_rndis_minor_ver = get_unaligned_le32(tmp++);
		params->dl_max_xfer_size = get_unaligned_le32(tmp++);

		pr_debug("%s(): RNDIS Host Major:%d Minor:%d version\n",
					__func__, params->host_rndis_major_ver,
					params->host_rndis_minor_ver);
		pr_debug("%s(): DL Max Transfer size:%x\n",
				__func__, params->dl_max_xfer_size);
		params->state = RNDIS_INITIALIZED;
		return rndis_init_response(params, (rndis_init_msg_type *)buf);

+3 −0
Original line number Diff line number Diff line
@@ -191,6 +191,9 @@ typedef struct rndis_params

	u32			vendorID;
	u8			max_pkt_per_xfer;
	u32			host_rndis_major_ver;
	u32			host_rndis_minor_ver;
	u32			dl_max_xfer_size;
	const char		*vendorDescr;
	u8			pkt_alignment_factor;
	void			(*resp_avail)(void *v);