From: Alex Elder Date: Sat, 13 Jun 2015 16:02:11 +0000 (-0500) Subject: greybus: esX: use one byte to encode cport ids in header X-Git-Tag: v4.9-rc1~119^2~378^2~21^2~1458^2 X-Git-Url: https://git.karo-electronics.de/?a=commitdiff_plain;h=4bc1389de9fcaaaf2f93e278f588858fb4fe2038;p=karo-tx-linux.git greybus: esX: use one byte to encode cport ids in header We now limit the maximum value for both host and module CPort ids, and we know they can always be represented in a single byte. Make use of this by using only one of the two pad bytes for encoding the CPort id in a message header. (Note that we have never used a CPort higher than 255. Encoding such a small CPort id in little endian 2-byte format has the same result as what is done here.) Signed-off-by: Alex Elder Signed-off-by: Greg Kroah-Hartman --- diff --git a/drivers/staging/greybus/es1.c b/drivers/staging/greybus/es1.c index 945dbe658ed1..d6824b6a83b4 100644 --- a/drivers/staging/greybus/es1.c +++ b/drivers/staging/greybus/es1.c @@ -173,19 +173,19 @@ static void free_urb(struct es1_ap_dev *es1, struct urb *urb) static void gb_message_cport_pack(struct gb_operation_msg_hdr *header, u16 cport_id) { - put_unaligned_le16(cport_id, header->pad); + header->pad[0] = cport_id; } /* Clear the pad bytes used for the CPort id */ static void gb_message_cport_clear(struct gb_operation_msg_hdr *header) { - put_unaligned_le16(0, header->pad); + header->pad[0] = 0; } /* Extract the CPort id packed into the header, and clear it */ static u16 gb_message_cport_unpack(struct gb_operation_msg_hdr *header) { - u16 cport_id = get_unaligned_le16(header->pad); + u16 cport_id = header->pad[0]; gb_message_cport_clear(header); @@ -574,6 +574,9 @@ static int ap_probe(struct usb_interface *interface, u8 ap_intf_id = 0x01; // FIXME - get endo "ID" from the SVC u8 svc_interval = 0; + /* We need to fit a CPort ID in one byte of a message header */ + BUILD_BUG_ON(CPORT_ID_MAX > U8_MAX); + udev = usb_get_dev(interface_to_usbdev(interface)); hd = greybus_create_hd(&es1_driver, &udev->dev, ES1_GBUF_MSG_SIZE_MAX); diff --git a/drivers/staging/greybus/es2.c b/drivers/staging/greybus/es2.c index d6966bf0a262..450a0162e8ad 100644 --- a/drivers/staging/greybus/es2.c +++ b/drivers/staging/greybus/es2.c @@ -173,19 +173,19 @@ static void free_urb(struct es1_ap_dev *es1, struct urb *urb) static void gb_message_cport_pack(struct gb_operation_msg_hdr *header, u16 cport_id) { - put_unaligned_le16(cport_id, header->pad); + header->pad[0] = cport_id; } /* Clear the pad bytes used for the CPort id */ static void gb_message_cport_clear(struct gb_operation_msg_hdr *header) { - put_unaligned_le16(0, header->pad); + header->pad[0] = 0; } /* Extract the CPort id packed into the header, and clear it */ static u16 gb_message_cport_unpack(struct gb_operation_msg_hdr *header) { - u16 cport_id = get_unaligned_le16(header->pad); + u16 cport_id = header->pad[0]; gb_message_cport_clear(header); @@ -574,6 +574,9 @@ static int ap_probe(struct usb_interface *interface, u8 ap_intf_id = 0x01; // FIXME - get endo "ID" from the SVC u8 svc_interval = 0; + /* We need to fit a CPort ID in one byte of a message header */ + BUILD_BUG_ON(CPORT_ID_MAX > U8_MAX); + udev = usb_get_dev(interface_to_usbdev(interface)); hd = greybus_create_hd(&es1_driver, &udev->dev, ES1_GBUF_MSG_SIZE_MAX);