ccbque.h revision 59490
1/* $NetBSD$ */ 2/* 3 * [NetBSD for NEC PC98 series] 4 * Copyright (c) 1994, 1995, 1996 NetBSD/pc98 porting staff. 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 3. The name of the author may not be used to endorse or promote products 16 * derived from this software without specific prior written permission. 17 * 18 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 19 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 20 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 21 * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, 22 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 23 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 24 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 25 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 26 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 27 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 28 * POSSIBILITY OF SUCH DAMAGE. 29 * 30 * $FreeBSD: head/sys/i386/isa/ccbque.h 59490 2000-04-22 15:07:02Z nyan $ 31 */ 32/* 33 * Common command control queue funcs. 34 * Written by N. Honda. 35 */ 36 37#ifndef _CCBQUE_H_ 38#define _CCBQUE_H_ 39 40#define CCB_MWANTED 0x01 41 42/* (I) structure and prototype */ 43#define GENERIC_CCB_ASSERT(DEV, CCBTYPE) \ 44TAILQ_HEAD(CCBTYPE##tab, CCBTYPE); \ 45struct CCBTYPE##que { \ 46 struct CCBTYPE##tab CCBTYPE##tab; \ 47 int count; \ 48 int maxccb; \ 49 u_int flags; \ 50}; \ 51 \ 52void DEV##_init_ccbque __P((int)); \ 53struct CCBTYPE *DEV##_get_ccb __P((void)); \ 54void DEV##_free_ccb __P((register struct CCBTYPE *)); 55 56/* (II) static allocated memory */ 57#define GENERIC_CCB_STATIC_ALLOC(DEV, CCBTYPE) \ 58static struct CCBTYPE##que CCBTYPE##que; 59 60/* (III) functions */ 61#define GENERIC_CCB(DEV, CCBTYPE, CHAIN) \ 62 \ 63void \ 64DEV##_init_ccbque(count) \ 65 int count; \ 66{ \ 67 if (CCBTYPE##que.maxccb == 0) \ 68 TAILQ_INIT(&CCBTYPE##que.CCBTYPE##tab); \ 69 CCBTYPE##que.maxccb += count; \ 70} \ 71 \ 72struct CCBTYPE * \ 73DEV##_get_ccb() \ 74{ \ 75 register struct CCBTYPE *cb; \ 76 int s = splcam(); \ 77 \ 78again: \ 79 if (CCBTYPE##que.count < CCBTYPE##que.maxccb) \ 80 { \ 81 CCBTYPE##que.count ++; \ 82 cb = CCBTYPE##que.CCBTYPE##tab.tqh_first; \ 83 if (cb != NULL) \ 84 { \ 85 TAILQ_REMOVE(&CCBTYPE##que.CCBTYPE##tab, cb, CHAIN);\ 86 goto out; \ 87 } \ 88 else \ 89 { \ 90 cb = malloc(sizeof(*cb), M_DEVBUF, M_NOWAIT); \ 91 if (cb != NULL) \ 92 { \ 93 bzero(cb, sizeof(*cb)); \ 94 goto out; \ 95 } \ 96 } \ 97 CCBTYPE##que.count --; \ 98 } \ 99 \ 100 cb = NULL; \ 101 \ 102out: \ 103 splx(s); \ 104 return cb; \ 105} \ 106 \ 107void \ 108DEV##_free_ccb(cb) \ 109 register struct CCBTYPE *cb; \ 110{ \ 111 int s = splcam(); \ 112 \ 113 TAILQ_INSERT_TAIL(&CCBTYPE##que.CCBTYPE##tab, cb, CHAIN); \ 114 CCBTYPE##que.count --; \ 115 \ 116 if (CCBTYPE##que.flags & CCB_MWANTED) \ 117 { \ 118 CCBTYPE##que.flags &= ~CCB_MWANTED; \ 119 wakeup ((caddr_t) &CCBTYPE##que.count); \ 120 } \ 121 splx(s); \ 122} 123#endif /* !_CCBQUE_H_ */ 124