18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * u_f.c -- USB function utilities for Gadget stack 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Copyright (c) 2013 Samsung Electronics Co., Ltd. 68c2ecf20Sopenharmony_ci * http://www.samsung.com 78c2ecf20Sopenharmony_ci * 88c2ecf20Sopenharmony_ci * Author: Andrzej Pietrasiewicz <andrzejtp2010@gmail.com> 98c2ecf20Sopenharmony_ci */ 108c2ecf20Sopenharmony_ci 118c2ecf20Sopenharmony_ci#include "u_f.h" 128c2ecf20Sopenharmony_ci#include <linux/usb/ch9.h> 138c2ecf20Sopenharmony_ci 148c2ecf20Sopenharmony_cistruct usb_request *alloc_ep_req(struct usb_ep *ep, size_t len) 158c2ecf20Sopenharmony_ci{ 168c2ecf20Sopenharmony_ci struct usb_request *req; 178c2ecf20Sopenharmony_ci 188c2ecf20Sopenharmony_ci req = usb_ep_alloc_request(ep, GFP_ATOMIC); 198c2ecf20Sopenharmony_ci if (req) { 208c2ecf20Sopenharmony_ci req->length = usb_endpoint_dir_out(ep->desc) ? 218c2ecf20Sopenharmony_ci usb_ep_align(ep, len) : len; 228c2ecf20Sopenharmony_ci req->buf = kmalloc(req->length, GFP_ATOMIC); 238c2ecf20Sopenharmony_ci if (!req->buf) { 248c2ecf20Sopenharmony_ci usb_ep_free_request(ep, req); 258c2ecf20Sopenharmony_ci req = NULL; 268c2ecf20Sopenharmony_ci } 278c2ecf20Sopenharmony_ci } 288c2ecf20Sopenharmony_ci return req; 298c2ecf20Sopenharmony_ci} 308c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(alloc_ep_req); 31