1*8930c119SMarkus Pfeiffer /* $FreeBSD: head/sys/dev/usb/usb_mbuf.h 196219 2009-08-14 20:03:53Z jhb $ */ 212bd3c8bSSascha Wildner /*- 312bd3c8bSSascha Wildner * Copyright (c) 2008 Hans Petter Selasky. All rights reserved. 412bd3c8bSSascha Wildner * 512bd3c8bSSascha Wildner * Redistribution and use in source and binary forms, with or without 612bd3c8bSSascha Wildner * modification, are permitted provided that the following conditions 712bd3c8bSSascha Wildner * are met: 812bd3c8bSSascha Wildner * 1. Redistributions of source code must retain the above copyright 912bd3c8bSSascha Wildner * notice, this list of conditions and the following disclaimer. 1012bd3c8bSSascha Wildner * 2. Redistributions in binary form must reproduce the above copyright 1112bd3c8bSSascha Wildner * notice, this list of conditions and the following disclaimer in the 1212bd3c8bSSascha Wildner * documentation and/or other materials provided with the distribution. 1312bd3c8bSSascha Wildner * 1412bd3c8bSSascha Wildner * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 1512bd3c8bSSascha Wildner * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 1612bd3c8bSSascha Wildner * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 1712bd3c8bSSascha Wildner * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 1812bd3c8bSSascha Wildner * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 1912bd3c8bSSascha Wildner * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2012bd3c8bSSascha Wildner * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2112bd3c8bSSascha Wildner * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2212bd3c8bSSascha Wildner * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 2312bd3c8bSSascha Wildner * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 2412bd3c8bSSascha Wildner * SUCH DAMAGE. 2512bd3c8bSSascha Wildner */ 2612bd3c8bSSascha Wildner 2712bd3c8bSSascha Wildner #ifndef _USB_MBUF_H_ 2812bd3c8bSSascha Wildner #define _USB_MBUF_H_ 2912bd3c8bSSascha Wildner 3012bd3c8bSSascha Wildner /* 3112bd3c8bSSascha Wildner * The following structure defines a minimum re-implementation of the 3212bd3c8bSSascha Wildner * mbuf system in the kernel. 3312bd3c8bSSascha Wildner */ 3412bd3c8bSSascha Wildner struct usb_mbuf { 3512bd3c8bSSascha Wildner uint8_t *cur_data_ptr; 3612bd3c8bSSascha Wildner uint8_t *min_data_ptr; 3712bd3c8bSSascha Wildner struct usb_mbuf *usb_nextpkt; 3812bd3c8bSSascha Wildner struct usb_mbuf *usb_next; 3912bd3c8bSSascha Wildner 4012bd3c8bSSascha Wildner usb_size_t cur_data_len; 4112bd3c8bSSascha Wildner usb_size_t max_data_len; 4212bd3c8bSSascha Wildner uint8_t last_packet:1; 4312bd3c8bSSascha Wildner uint8_t unused:7; 4412bd3c8bSSascha Wildner }; 4512bd3c8bSSascha Wildner 4612bd3c8bSSascha Wildner #define USB_IF_ENQUEUE(ifq, m) do { \ 4712bd3c8bSSascha Wildner (m)->usb_nextpkt = NULL; \ 4812bd3c8bSSascha Wildner if ((ifq)->ifq_tail == NULL) \ 4912bd3c8bSSascha Wildner (ifq)->ifq_head = (m); \ 5012bd3c8bSSascha Wildner else \ 5112bd3c8bSSascha Wildner (ifq)->ifq_tail->usb_nextpkt = (m); \ 5212bd3c8bSSascha Wildner (ifq)->ifq_tail = (m); \ 5312bd3c8bSSascha Wildner (ifq)->ifq_len++; \ 5412bd3c8bSSascha Wildner } while (0) 5512bd3c8bSSascha Wildner 5612bd3c8bSSascha Wildner #define USB_IF_DEQUEUE(ifq, m) do { \ 5712bd3c8bSSascha Wildner (m) = (ifq)->ifq_head; \ 5812bd3c8bSSascha Wildner if (m) { \ 5912bd3c8bSSascha Wildner if (((ifq)->ifq_head = (m)->usb_nextpkt) == NULL) { \ 6012bd3c8bSSascha Wildner (ifq)->ifq_tail = NULL; \ 6112bd3c8bSSascha Wildner } \ 6212bd3c8bSSascha Wildner (m)->usb_nextpkt = NULL; \ 6312bd3c8bSSascha Wildner (ifq)->ifq_len--; \ 6412bd3c8bSSascha Wildner } \ 6512bd3c8bSSascha Wildner } while (0) 6612bd3c8bSSascha Wildner 6712bd3c8bSSascha Wildner #define USB_IF_PREPEND(ifq, m) do { \ 6812bd3c8bSSascha Wildner (m)->usb_nextpkt = (ifq)->ifq_head; \ 6912bd3c8bSSascha Wildner if ((ifq)->ifq_tail == NULL) { \ 7012bd3c8bSSascha Wildner (ifq)->ifq_tail = (m); \ 7112bd3c8bSSascha Wildner } \ 7212bd3c8bSSascha Wildner (ifq)->ifq_head = (m); \ 7312bd3c8bSSascha Wildner (ifq)->ifq_len++; \ 7412bd3c8bSSascha Wildner } while (0) 7512bd3c8bSSascha Wildner 7612bd3c8bSSascha Wildner #define USB_IF_QFULL(ifq) ((ifq)->ifq_len >= (ifq)->ifq_maxlen) 7712bd3c8bSSascha Wildner #define USB_IF_QLEN(ifq) ((ifq)->ifq_len) 7812bd3c8bSSascha Wildner #define USB_IF_POLL(ifq, m) ((m) = (ifq)->ifq_head) 7912bd3c8bSSascha Wildner 8012bd3c8bSSascha Wildner #define USB_MBUF_RESET(m) do { \ 8112bd3c8bSSascha Wildner (m)->cur_data_ptr = (m)->min_data_ptr; \ 8212bd3c8bSSascha Wildner (m)->cur_data_len = (m)->max_data_len; \ 8312bd3c8bSSascha Wildner (m)->last_packet = 0; \ 8412bd3c8bSSascha Wildner } while (0) 8512bd3c8bSSascha Wildner 8612bd3c8bSSascha Wildner /* prototypes */ 8712bd3c8bSSascha Wildner void *usb_alloc_mbufs(struct malloc_type *type, struct usb_ifqueue *ifq, 8812bd3c8bSSascha Wildner usb_size_t block_size, uint16_t nblocks); 8912bd3c8bSSascha Wildner 9012bd3c8bSSascha Wildner #endif /* _USB_MBUF_H_ */ 91