Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

usb: gadget: u_os_desc: helper functions for accessing ext prop buffer

Provide helper functions to get pointers to particular locations within
a buffer holding an extended properties descriptor.

Signed-off-by: Andrzej Pietrasiewicz <andrzej.p@samsung.com>
Signed-off-by: Felipe Balbi <balbi@ti.com>

authored by

Andrzej Pietrasiewicz and committed by
Felipe Balbi
7ea4f088 f96cbd14

+46 -13
+46 -13
drivers/usb/gadget/u_os_desc.h
··· 35 35 #define USB_EXT_PROP_UNICODE_LINK 6 36 36 #define USB_EXT_PROP_UNICODE_MULTI 7 37 37 38 + static inline u8 *__usb_ext_prop_ptr(u8 *buf, size_t offset) 39 + { 40 + return buf + offset; 41 + } 42 + 43 + static inline u8 *usb_ext_prop_size_ptr(u8 *buf) 44 + { 45 + return __usb_ext_prop_ptr(buf, USB_EXT_PROP_DW_SIZE); 46 + } 47 + 48 + static inline u8 *usb_ext_prop_type_ptr(u8 *buf) 49 + { 50 + return __usb_ext_prop_ptr(buf, USB_EXT_PROP_DW_PROPERTY_DATA_TYPE); 51 + } 52 + 53 + static inline u8 *usb_ext_prop_name_len_ptr(u8 *buf) 54 + { 55 + return __usb_ext_prop_ptr(buf, USB_EXT_PROP_W_PROPERTY_NAME_LENGTH); 56 + } 57 + 58 + static inline u8 *usb_ext_prop_name_ptr(u8 *buf) 59 + { 60 + return __usb_ext_prop_ptr(buf, USB_EXT_PROP_B_PROPERTY_NAME); 61 + } 62 + 63 + static inline u8 *usb_ext_prop_data_len_ptr(u8 *buf, size_t off) 64 + { 65 + return __usb_ext_prop_ptr(buf, 66 + USB_EXT_PROP_DW_PROPERTY_DATA_LENGTH + off); 67 + } 68 + 69 + static inline u8 *usb_ext_prop_data_ptr(u8 *buf, size_t off) 70 + { 71 + return __usb_ext_prop_ptr(buf, USB_EXT_PROP_B_PROPERTY_DATA + off); 72 + } 73 + 38 74 static inline void usb_ext_prop_put_size(u8 *buf, int dw_size) 39 75 { 40 - put_unaligned_le32(dw_size, &buf[USB_EXT_PROP_DW_SIZE]); 76 + put_unaligned_le32(dw_size, usb_ext_prop_size_ptr(buf)); 41 77 } 42 78 43 79 static inline void usb_ext_prop_put_type(u8 *buf, int type) 44 80 { 45 - put_unaligned_le32(type, &buf[USB_EXT_PROP_DW_PROPERTY_DATA_TYPE]); 81 + put_unaligned_le32(type, usb_ext_prop_type_ptr(buf)); 46 82 } 47 83 48 84 static inline int usb_ext_prop_put_name(u8 *buf, const char *name, int pnl) 49 85 { 50 86 int result; 51 87 52 - put_unaligned_le16(pnl, &buf[USB_EXT_PROP_W_PROPERTY_NAME_LENGTH]); 88 + put_unaligned_le16(pnl, usb_ext_prop_name_len_ptr(buf)); 53 89 result = utf8s_to_utf16s(name, strlen(name), UTF16_LITTLE_ENDIAN, 54 - (wchar_t *) &buf[USB_EXT_PROP_B_PROPERTY_NAME], pnl - 2); 90 + (wchar_t *) usb_ext_prop_name_ptr(buf), pnl - 2); 55 91 if (result < 0) 56 92 return result; 57 93 58 - put_unaligned_le16(0, &buf[USB_EXT_PROP_B_PROPERTY_NAME + pnl]); 94 + put_unaligned_le16(0, &buf[USB_EXT_PROP_B_PROPERTY_NAME + pnl - 2]); 59 95 60 96 return pnl; 61 97 } ··· 99 63 static inline void usb_ext_prop_put_binary(u8 *buf, int pnl, const u8 *data, 100 64 int data_len) 101 65 { 102 - put_unaligned_le32(data_len, 103 - &buf[USB_EXT_PROP_DW_PROPERTY_DATA_LENGTH + pnl]); 104 - memcpy(&buf[USB_EXT_PROP_B_PROPERTY_DATA + pnl], data, data_len); 66 + put_unaligned_le32(data_len, usb_ext_prop_data_len_ptr(buf, pnl)); 67 + memcpy(usb_ext_prop_data_ptr(buf, pnl), data, data_len); 105 68 } 106 69 107 70 static inline int usb_ext_prop_put_unicode(u8 *buf, int pnl, const char *string, 108 71 int data_len) 109 72 { 110 73 int result; 111 - put_unaligned_le32(data_len, 112 - &buf[USB_EXT_PROP_DW_PROPERTY_DATA_LENGTH + pnl]); 113 - 74 + put_unaligned_le32(data_len, usb_ext_prop_data_len_ptr(buf, pnl)); 114 75 result = utf8s_to_utf16s(string, data_len >> 1, UTF16_LITTLE_ENDIAN, 115 - (wchar_t *) &buf[USB_EXT_PROP_B_PROPERTY_DATA + pnl], 76 + (wchar_t *) usb_ext_prop_data_ptr(buf, pnl), 116 77 data_len - 2); 117 78 if (result < 0) 118 79 return result; 119 80 120 81 put_unaligned_le16(0, 121 - &buf[USB_EXT_PROP_B_PROPERTY_DATA + pnl + data_len]); 82 + &buf[USB_EXT_PROP_B_PROPERTY_DATA + pnl + data_len - 2]); 122 83 123 84 return data_len; 124 85 }