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

Commit 7765752e authored by qctecmdr Service's avatar qctecmdr Service Committed by Gerrit - the friendly Code Review server
Browse files

Merge "qrtr: Add support to read qrtr packet size"

parents 71f4785d 4a2e8877
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -1475,6 +1475,9 @@ static int __qcom_glink_send(struct glink_channel *channel,
			if (intent)
				break;

			if (atomic_read(&glink->in_reset))
				return -ECONNRESET;

			if (!wait)
				return -EBUSY;

@@ -1505,6 +1508,7 @@ static int __qcom_glink_send(struct glink_channel *channel,
	}

	while (left_size > 0) {
		data = (void *)((char *)data + chunk_size);
		chunk_size = left_size;
		if (chunk_size > SZ_8K)
			chunk_size = SZ_8K;
+1 −1
Original line number Diff line number Diff line
@@ -338,7 +338,7 @@ static int __init glink_rpm_init(void)
{
	return platform_driver_register(&glink_rpm_driver);
}
subsys_initcall(glink_rpm_init);
postcore_initcall(glink_rpm_init);

static void __exit glink_rpm_exit(void)
{
+47 −0
Original line number Diff line number Diff line
@@ -36,6 +36,8 @@
#define QRTR_MIN_EPH_SOCKET 0x4000
#define QRTR_MAX_EPH_SOCKET 0x7fff

#define QRTR_PORT_CTRL_LEGACY 0xffff

/* qrtr socket states */
#define QRTR_STATE_MULTI	-2
#define QRTR_STATE_INIT	-1
@@ -616,6 +618,48 @@ static void qrtr_node_assign(struct qrtr_node *node, unsigned int nid)
	}
}

/**
 * qrtr_peek_pkt_size() - Peek into the packet header to get potential pkt size
 *
 * @data: Starting address of the packet which points to router header.
 *
 * @returns: potential packet size on success, < 0 on error.
 *
 * This function is used by the underlying transport abstraction layer to
 * peek into the potential packet size of an incoming packet. This information
 * is used to perform link layer fragmentation and re-assembly
 */
int qrtr_peek_pkt_size(const void *data)
{
	const struct qrtr_hdr_v1 *v1;
	const struct qrtr_hdr_v2 *v2;
	unsigned int hdrlen;
	unsigned int size;
	unsigned int ver;

	/* Version field in v1 is little endian, so this works for both cases */
	ver = *(u8 *)data;

	switch (ver) {
	case QRTR_PROTO_VER_1:
		v1 = data;
		hdrlen = sizeof(*v1);
		size = le32_to_cpu(v1->size);
		break;
	case QRTR_PROTO_VER_2:
		v2 = data;
		hdrlen = sizeof(*v2) + v2->optlen;
		size = le32_to_cpu(v2->size);
		break;
	default:
		pr_err("qrtr: Invalid version %d\n", ver);
		return -EINVAL;
	}

	return ALIGN(size, 4) + hdrlen;
}
EXPORT_SYMBOL(qrtr_peek_pkt_size);

/**
 * qrtr_endpoint_post() - post incoming data
 * @ep: endpoint handle
@@ -684,6 +728,9 @@ int qrtr_endpoint_post(struct qrtr_endpoint *ep, const void *data, size_t len)
		goto err;
	}

	if (cb->dst_port == QRTR_PORT_CTRL_LEGACY)
		cb->dst_port = QRTR_PORT_CTRL;

	if (len != ALIGN(size, 4) + hdrlen)
		goto err;

+1 −0
Original line number Diff line number Diff line
@@ -32,4 +32,5 @@ void qrtr_endpoint_unregister(struct qrtr_endpoint *ep);

int qrtr_endpoint_post(struct qrtr_endpoint *ep, const void *data, size_t len);

int qrtr_peek_pkt_size(const void *data);
#endif
+1 −0
Original line number Diff line number Diff line
@@ -290,6 +290,7 @@ static void qcom_usb_qrtr_disconnect(struct usb_interface *interface)
static const struct usb_device_id qcom_usb_qrtr_ids[] = {
	{ USB_DEVICE_INTERFACE_NUMBER(QRTR_VENDOR_ID, 0x90ef, 3) },
	{ USB_DEVICE_INTERFACE_NUMBER(QRTR_VENDOR_ID, 0x90f0, 3) },
	{ USB_DEVICE_INTERFACE_NUMBER(QRTR_VENDOR_ID, 0x90f3, 2) },
	{ } /* Terminating entry */
};
MODULE_DEVICE_TABLE(usb, qcom_usb_qrtr_ids);