]> git.saurik.com Git - apple/xnu.git/blob - bsd/netat/adsp_misc.c
xnu-792.21.3.tar.gz
[apple/xnu.git] / bsd / netat / adsp_misc.c
1 /*
2 * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
3 *
4 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
5 *
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. The rights granted to you under the License
10 * may not be used to create, or enable the creation or redistribution of,
11 * unlawful or unlicensed copies of an Apple operating system, or to
12 * circumvent, violate, or enable the circumvention or violation of, any
13 * terms of an Apple operating system software license agreement.
14 *
15 * Please obtain a copy of the License at
16 * http://www.opensource.apple.com/apsl/ and read it before using this file.
17 *
18 * The Original Code and all software distributed under the License are
19 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23 * Please see the License for the specific language governing rights and
24 * limitations under the License.
25 *
26 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
27 */
28 #include <sys/errno.h>
29 #include <sys/types.h>
30 #include <sys/param.h>
31 #include <machine/spl.h>
32 #include <sys/systm.h>
33 #include <sys/kernel.h>
34 #include <sys/proc.h>
35 #include <sys/filedesc.h>
36 #include <sys/fcntl.h>
37 #include <sys/mbuf.h>
38 #include <sys/socket.h>
39
40 #include <netat/sysglue.h>
41 #include <netat/appletalk.h>
42 #include <netat/at_pcb.h>
43 #include <netat/debug.h>
44 #include <netat/adsp.h>
45 #include <netat/adsp_internal.h>
46
47 /*
48 * These function replace the Mk68 assembly routines found in qAddToEnd.s and
49 * q????.s
50 * Modified for MP, 1996 by Tuyen Nguyen
51 * Modified, April 9, 1997 by Tuyen Nguyen for MacOSX.
52 */
53 extern atlock_t adspgen_lock;
54
55
56 struct qlink {
57 struct qlink *qlinkp;
58 };
59
60 /* ----------------------------------------------------------------------
61 * void qAddToEnd(void *qhead, void *qelem)
62 *
63 * INPUTS:
64 * Ptr to ptr to 1st item in queue
65 * Ptr to item to add to end of queue
66 * OUTPUTS:
67 * none
68 *
69 * Assumptions: The link field is the FIRST field of the qelem structure.
70 * ----------------------------------------------------------------------
71 */
72 int qAddToEnd(qhead, qelem)
73 struct qlink **qhead;
74 struct qlink *qelem;
75 {
76 /* define our own type to access the next field. NOTE THAT THE "NEXT"
77 * FIELD IS ASSUMED TO BE THE FIRST FIELD OF THE STRUCTURE
78 */
79
80 register struct qlink *q;
81
82 /* Scan the linked list to the end and update the previous
83 * element next field. (do that protocted).
84 */
85
86 q = *qhead;
87 if (q) {
88 while (q->qlinkp) {
89 /* are we about to link to ourself */
90 if (q == qelem)
91 goto breakit;
92 q = q->qlinkp;
93 }
94 q->qlinkp = qelem;
95 }
96 else {
97 *qhead = qelem;
98 }
99 qelem->qlinkp = (struct qlink *) 0;
100 breakit:
101 #ifdef NOTDEF
102 DPRINTF("%s: qhead=%x added elem=%x\n","qAddToEnd", qhead, qelem);
103 #endif
104 return 0;
105 }
106
107
108
109 /* ----------------------------------------------------------------------
110 * qfind_m
111 * void* qfind_m(void *qhead, void NPTR match, ProcPtr compare_fnx)
112 *
113 * Hunt down a linked list of queue elements calling the compare
114 * function on each item. When the compare function returns true,
115 * return ptr to the queue element.
116 *
117 *
118 * INPUTS:
119 * qhead Address of ptr to first item in queue
120 * match
121 * compare_fnx
122 * OUTPUTS:
123 * D0 & A0 Ptr to queue element or NIL
124 * REGISTERS:
125 * D0,D1,A0,A1
126 * ----------------------------------------------------------------------
127 */
128 void* qfind_m(qhead, match, compare_fnx)
129 CCBPtr qhead;
130 void *match;
131 ProcPtr compare_fnx;
132 {
133 int s;
134 CCBPtr queue_item = qhead;
135
136 ATDISABLE(s, adspgen_lock);
137 while (queue_item) {
138 if ((*compare_fnx)(queue_item,match))
139 break;
140
141 queue_item = queue_item->ccbLink;
142 }
143 ATENABLE(s, adspgen_lock);
144
145 return (queue_item);
146 }