u_f.h 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * u_f.h
  4. *
  5. * Utility definitions for USB functions
  6. *
  7. * Copyright (c) 2013 Samsung Electronics Co., Ltd.
  8. * http://www.samsung.com
  9. *
  10. * Author: Andrzej Pietrasiewicz <[email protected]>
  11. */
  12. #ifndef __U_F_H__
  13. #define __U_F_H__
  14. #include <linux/usb/gadget.h>
  15. #include <linux/overflow.h>
  16. /* Variable Length Array Macros **********************************************/
  17. #define vla_group(groupname) size_t groupname##__next = 0
  18. #define vla_group_size(groupname) groupname##__next
  19. #define vla_item(groupname, type, name, n) \
  20. size_t groupname##_##name##__offset = ({ \
  21. size_t offset = 0; \
  22. if (groupname##__next != SIZE_MAX) { \
  23. size_t align_mask = __alignof__(type) - 1; \
  24. size_t size = array_size(n, sizeof(type)); \
  25. offset = (groupname##__next + align_mask) & \
  26. ~align_mask; \
  27. if (check_add_overflow(offset, size, \
  28. &groupname##__next)) { \
  29. groupname##__next = SIZE_MAX; \
  30. offset = 0; \
  31. } \
  32. } \
  33. offset; \
  34. })
  35. #define vla_item_with_sz(groupname, type, name, n) \
  36. size_t groupname##_##name##__sz = array_size(n, sizeof(type)); \
  37. size_t groupname##_##name##__offset = ({ \
  38. size_t offset = 0; \
  39. if (groupname##__next != SIZE_MAX) { \
  40. size_t align_mask = __alignof__(type) - 1; \
  41. offset = (groupname##__next + align_mask) & \
  42. ~align_mask; \
  43. if (check_add_overflow(offset, groupname##_##name##__sz,\
  44. &groupname##__next)) { \
  45. groupname##__next = SIZE_MAX; \
  46. offset = 0; \
  47. } \
  48. } \
  49. offset; \
  50. })
  51. #define vla_ptr(ptr, groupname, name) \
  52. ((void *) ((char *)ptr + groupname##_##name##__offset))
  53. struct usb_ep;
  54. struct usb_request;
  55. /**
  56. * alloc_ep_req - returns a usb_request allocated by the gadget driver and
  57. * allocates the request's buffer.
  58. *
  59. * @ep: the endpoint to allocate a usb_request
  60. * @len: usb_requests's buffer suggested size
  61. *
  62. * In case @ep direction is OUT, the @len will be aligned to ep's
  63. * wMaxPacketSize. In order to avoid memory leaks or drops, *always* use
  64. * usb_requests's length (req->length) to refer to the allocated buffer size.
  65. * Requests allocated via alloc_ep_req() *must* be freed by free_ep_req().
  66. */
  67. struct usb_request *alloc_ep_req(struct usb_ep *ep, size_t len);
  68. /* Frees a usb_request previously allocated by alloc_ep_req() */
  69. static inline void free_ep_req(struct usb_ep *ep, struct usb_request *req)
  70. {
  71. WARN_ON(req->buf == NULL);
  72. kfree(req->buf);
  73. req->buf = NULL;
  74. usb_ep_free_request(ep, req);
  75. }
  76. #endif /* __U_F_H__ */