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

Commit cd43049d authored by Hemant Kumar's avatar Hemant Kumar
Browse files

net: usb: rmnet: Use correct endianness for control MUX header



Embedded rmnet control driver requires to handle muxing and
de-muxing of control packet using big endian mux header format.

Change-Id: Ia28a2b9c604d9b34b243fb2039fe31112651f619
Signed-off-by: default avatarHemant Kumar <hemantk@codeaurora.org>
parent a9877b83
Loading
Loading
Loading
Loading
+10 −7
Original line number Diff line number Diff line
@@ -29,25 +29,28 @@
#define RMNET_CTRL_DEV_READY	1
#define RMNET_CTRL_DEV_MUX_EN	2

/*MUX header bit masks*/
#define MUX_CTRL_MASK	0x1
/*data MUX header bit mask*/
#define MUX_PAD_SHIFT	0x2

/*big endian format ctrl MUX header bit masks*/
#define MUX_CTRL_PADLEN_MASK	0x3F
#define MUX_CTRL_MASK	0x80

/*max padding bytes for n byte alignment*/
#define MAX_PAD_BYTES(n)	(n-1)

/*
 *MUX Header Format
 *BIT 0 : Mux type 0: Data, 1: control
 *BIT 1: Reserved
 *BIT 2-7: Pad bytes
 *MUX Header big endian Format
 *BIT 0 - 5 : Pad bytes
 *BIT 6: Reserved
 *BIT 7: Mux type 0: Data, 1: control
 *BIT 8-15: Mux ID
 *BIT 16-31: PACKET_LEN_WITH_PADDING (Bytes)
 */
struct mux_hdr {
	__u8	padding_info;
	__u8	mux_id;
	__le16	pkt_len_w_padding;
	__u16	pkt_len_w_padding;
} __packed;

struct rmnet_ctrl_dev {
+6 −5
Original line number Diff line number Diff line
@@ -124,7 +124,7 @@ static int rmnet_usb_ctrl_dmux(struct ctrl_pkt_list_elem *clist)
	unsigned int	mux_id;

	hdr = (struct mux_hdr *)clist->cpkt.data;
	pad_len = hdr->padding_info >> MUX_PAD_SHIFT;
	pad_len = hdr->padding_info & MUX_CTRL_PADLEN_MASK;
	if (pad_len > MAX_PAD_BYTES(4)) {
		pr_err_ratelimited("%s: Invalid pad len %d\n", __func__,
				pad_len);
@@ -137,7 +137,7 @@ static int rmnet_usb_ctrl_dmux(struct ctrl_pkt_list_elem *clist)
		return -EINVAL;
	}

	total_len = le16_to_cpu(hdr->pkt_len_w_padding);
	total_len = ntohs(hdr->pkt_len_w_padding);
	if (!total_len || !(total_len - pad_len)) {
		pr_err_ratelimited("%s: Invalid pkt length %d\n", __func__,
				total_len);
@@ -162,10 +162,11 @@ static void rmnet_usb_ctrl_mux(unsigned int id, struct ctrl_pkt *cpkt)
	/*add padding if len is not 4 byte aligned*/
	pad_len =  ALIGN(len, 4) - len;

	hdr->pkt_len_w_padding = cpu_to_le16(len + pad_len);
	hdr->padding_info = (pad_len << MUX_PAD_SHIFT) | MUX_CTRL_MASK;
	hdr->pkt_len_w_padding = htons(len + pad_len);
	hdr->padding_info = (pad_len &  MUX_CTRL_PADLEN_MASK) | MUX_CTRL_MASK;

	cpkt->data_size = sizeof(struct mux_hdr) + hdr->pkt_len_w_padding;
	cpkt->data_size = sizeof(struct mux_hdr) +
		ntohs(hdr->pkt_len_w_padding);
}

static void get_encap_work(struct work_struct *w)