1219393Sadrian/* $FreeBSD: releng/11.0/sys/dev/usb/usb_mbuf.h 196219 2009-08-14 20:03:53Z jhb $ */
2219393Sadrian/*-
3219393Sadrian * Copyright (c) 2008 Hans Petter Selasky. All rights reserved.
4219393Sadrian *
5219393Sadrian * Redistribution and use in source and binary forms, with or without
6219393Sadrian * modification, are permitted provided that the following conditions
7219393Sadrian * are met:
8219393Sadrian * 1. Redistributions of source code must retain the above copyright
9219393Sadrian *    notice, this list of conditions and the following disclaimer.
10219393Sadrian * 2. Redistributions in binary form must reproduce the above copyright
11219393Sadrian *    notice, this list of conditions and the following disclaimer in the
12219393Sadrian *    documentation and/or other materials provided with the distribution.
13219393Sadrian *
14219393Sadrian * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15219393Sadrian * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16219393Sadrian * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17219393Sadrian * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18219393Sadrian * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19219393Sadrian * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20219393Sadrian * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21219393Sadrian * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22219393Sadrian * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23219393Sadrian * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24219393Sadrian * SUCH DAMAGE.
25219393Sadrian */
26219393Sadrian
27219393Sadrian#ifndef _USB_MBUF_H_
28219393Sadrian#define	_USB_MBUF_H_
29219393Sadrian
30219393Sadrian/*
31219393Sadrian * The following structure defines a minimum re-implementation of the
32219393Sadrian * mbuf system in the kernel.
33219393Sadrian */
34219393Sadrianstruct usb_mbuf {
35219393Sadrian	uint8_t *cur_data_ptr;
36219393Sadrian	uint8_t *min_data_ptr;
37219393Sadrian	struct usb_mbuf *usb_nextpkt;
38219393Sadrian	struct usb_mbuf *usb_next;
39219393Sadrian
40219393Sadrian	usb_size_t cur_data_len;
41219393Sadrian	usb_size_t max_data_len;
42219393Sadrian	uint8_t last_packet:1;
43219393Sadrian	uint8_t unused:7;
44219393Sadrian};
45219393Sadrian
46219393Sadrian#define	USB_IF_ENQUEUE(ifq, m) do {		\
47219393Sadrian    (m)->usb_nextpkt = NULL;			\
48219393Sadrian    if ((ifq)->ifq_tail == NULL)		\
49219393Sadrian        (ifq)->ifq_head = (m);			\
50219393Sadrian    else					\
51219393Sadrian        (ifq)->ifq_tail->usb_nextpkt = (m);	\
52219393Sadrian    (ifq)->ifq_tail = (m);			\
53219393Sadrian    (ifq)->ifq_len++;				\
54219393Sadrian  } while (0)
55219393Sadrian
56219393Sadrian#define	USB_IF_DEQUEUE(ifq, m) do {				\
57219393Sadrian    (m) = (ifq)->ifq_head;					\
58219393Sadrian    if (m) {							\
59219393Sadrian        if (((ifq)->ifq_head = (m)->usb_nextpkt) == NULL) {	\
60219393Sadrian	     (ifq)->ifq_tail = NULL;				\
61219393Sadrian	}							\
62219393Sadrian	(m)->usb_nextpkt = NULL;				\
63219393Sadrian	(ifq)->ifq_len--;					\
64219393Sadrian    }								\
65219393Sadrian  } while (0)
66219393Sadrian
67219393Sadrian#define	USB_IF_PREPEND(ifq, m) do {		\
68219393Sadrian      (m)->usb_nextpkt = (ifq)->ifq_head;	\
69219393Sadrian      if ((ifq)->ifq_tail == NULL) {		\
70219586Sadrian	  (ifq)->ifq_tail = (m);		\
71219393Sadrian      }						\
72219393Sadrian      (ifq)->ifq_head = (m);			\
73219393Sadrian      (ifq)->ifq_len++;				\
74219393Sadrian  } while (0)
75219393Sadrian
76219393Sadrian#define	USB_IF_QFULL(ifq)   ((ifq)->ifq_len >= (ifq)->ifq_maxlen)
77219393Sadrian#define	USB_IF_QLEN(ifq)    ((ifq)->ifq_len)
78219393Sadrian#define	USB_IF_POLL(ifq, m) ((m) = (ifq)->ifq_head)
79219393Sadrian
80219393Sadrian#define	USB_MBUF_RESET(m) do {			\
81219393Sadrian    (m)->cur_data_ptr = (m)->min_data_ptr;	\
82219393Sadrian    (m)->cur_data_len = (m)->max_data_len;	\
83219393Sadrian    (m)->last_packet = 0;			\
84219393Sadrian  } while (0)
85219393Sadrian
86219393Sadrian/* prototypes */
87219393Sadrianvoid   *usb_alloc_mbufs(struct malloc_type *type, struct usb_ifqueue *ifq,
88219393Sadrian	    usb_size_t block_size, uint16_t nblocks);
89219393Sadrian
90219393Sadrian#endif					/* _USB_MBUF_H_ */
91219393Sadrian