1f9f848faSopenharmony_ci/*- 2f9f848faSopenharmony_ci * SPDX-License-Identifier: BSD-2-Clause 3f9f848faSopenharmony_ci * 4f9f848faSopenharmony_ci * Copyright (c) 2008 Hans Petter Selasky. All rights reserved. 5f9f848faSopenharmony_ci * 6f9f848faSopenharmony_ci * Redistribution and use in source and binary forms, with or without 7f9f848faSopenharmony_ci * modification, are permitted provided that the following conditions 8f9f848faSopenharmony_ci * are met: 9f9f848faSopenharmony_ci * 1. Redistributions of source code must retain the above copyright 10f9f848faSopenharmony_ci * notice, this list of conditions and the following disclaimer. 11f9f848faSopenharmony_ci * 2. Redistributions in binary form must reproduce the above copyright 12f9f848faSopenharmony_ci * notice, this list of conditions and the following disclaimer in the 13f9f848faSopenharmony_ci * documentation and/or other materials provided with the distribution. 14f9f848faSopenharmony_ci * 15f9f848faSopenharmony_ci * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 16f9f848faSopenharmony_ci * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17f9f848faSopenharmony_ci * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18f9f848faSopenharmony_ci * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 19f9f848faSopenharmony_ci * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20f9f848faSopenharmony_ci * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 21f9f848faSopenharmony_ci * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22f9f848faSopenharmony_ci * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23f9f848faSopenharmony_ci * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24f9f848faSopenharmony_ci * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25f9f848faSopenharmony_ci * SUCH DAMAGE. 26f9f848faSopenharmony_ci */ 27f9f848faSopenharmony_ci 28f9f848faSopenharmony_ci#include "implementation/global_implementation.h" 29f9f848faSopenharmony_ci 30f9f848faSopenharmony_ci/*------------------------------------------------------------------------* 31f9f848faSopenharmony_ci * usb_alloc_mbufs - allocate mbufs to an usbd interface queue 32f9f848faSopenharmony_ci * 33f9f848faSopenharmony_ci * Returns: 34f9f848faSopenharmony_ci * A pointer that should be passed to "free()" when the buffer(s) 35f9f848faSopenharmony_ci * should be released. 36f9f848faSopenharmony_ci *------------------------------------------------------------------------*/ 37f9f848faSopenharmony_civoid * 38f9f848faSopenharmony_ciusb_alloc_mbufs(struct malloc_type *type, struct usb_ifqueue *ifq, 39f9f848faSopenharmony_ci usb_size_t block_size, uint16_t nblocks) 40f9f848faSopenharmony_ci{ 41f9f848faSopenharmony_ci struct usb_mbuf *m_ptr; 42f9f848faSopenharmony_ci uint8_t *data_ptr; 43f9f848faSopenharmony_ci void *free_ptr = NULL; 44f9f848faSopenharmony_ci usb_size_t alloc_size; 45f9f848faSopenharmony_ci 46f9f848faSopenharmony_ci /* align data */ 47f9f848faSopenharmony_ci block_size += ((-block_size) & (USB_HOST_ALIGN - 1)); 48f9f848faSopenharmony_ci 49f9f848faSopenharmony_ci if (nblocks && block_size) { 50f9f848faSopenharmony_ci alloc_size = (block_size + sizeof(struct usb_mbuf)) * nblocks; 51f9f848faSopenharmony_ci 52f9f848faSopenharmony_ci free_ptr = zalloc(alloc_size); 53f9f848faSopenharmony_ci 54f9f848faSopenharmony_ci if (free_ptr == NULL) { 55f9f848faSopenharmony_ci goto done; 56f9f848faSopenharmony_ci } 57f9f848faSopenharmony_ci m_ptr = free_ptr; 58f9f848faSopenharmony_ci data_ptr = (void *)(m_ptr + nblocks); 59f9f848faSopenharmony_ci 60f9f848faSopenharmony_ci while (nblocks--) { 61f9f848faSopenharmony_ci 62f9f848faSopenharmony_ci m_ptr->cur_data_ptr = 63f9f848faSopenharmony_ci m_ptr->min_data_ptr = data_ptr; 64f9f848faSopenharmony_ci 65f9f848faSopenharmony_ci m_ptr->cur_data_len = 66f9f848faSopenharmony_ci m_ptr->max_data_len = block_size; 67f9f848faSopenharmony_ci 68f9f848faSopenharmony_ci USB_IF_ENQUEUE(ifq, m_ptr); 69f9f848faSopenharmony_ci 70f9f848faSopenharmony_ci m_ptr++; 71f9f848faSopenharmony_ci data_ptr += block_size; 72f9f848faSopenharmony_ci } 73f9f848faSopenharmony_ci } 74f9f848faSopenharmony_cidone: 75f9f848faSopenharmony_ci return (free_ptr); 76f9f848faSopenharmony_ci} 77