]> git.saurik.com Git - apple/xnu.git/blob - iokit/Families/IOSCSIParallel/queueHelpers.cpp
569418feb540887f178da0f8d9256280083155ab
[apple/xnu.git] / iokit / Families / IOSCSIParallel / queueHelpers.cpp
1 /*
2 * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved.
3 *
4 * @APPLE_LICENSE_HEADER_START@
5 *
6 * The contents of this file constitute Original Code as defined in and
7 * are subject to the Apple Public Source License Version 1.1 (the
8 * "License"). You may not use this file except in compliance with the
9 * License. Please obtain a copy of the License at
10 * http://www.apple.com/publicsource and read it before using this file.
11 *
12 * This Original Code and all software distributed under the License are
13 * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
14 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
15 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
17 * License for the specific language governing rights and limitations
18 * under the License.
19 *
20 * @APPLE_LICENSE_HEADER_END@
21 */
22 /*
23 *
24 * queueHelpers.cpp
25 *
26 */
27 #include <IOKit/scsi/IOSCSIParallelInterface.h>
28
29 void IOSCSIParallelDevice::addCommand( queue_head_t *list, IOSCSIParallelCommand *scsiCmd )
30 {
31 scsiCmd->list = list;
32
33 queue_enter( list, scsiCmd, IOSCSIParallelCommand *, nextCommand );
34 }
35
36 void IOSCSIParallelDevice::deleteCommand( queue_head_t *list, IOSCSIParallelCommand *scsiCmd, IOReturn rc = kIOReturnSuccess )
37 {
38 scsiCmd->list = 0;
39
40 if ( rc != kIOReturnSuccess )
41 {
42 if ( scsiCmd->results.returnCode == kIOReturnSuccess )
43 {
44 scsiCmd->results.returnCode = (IOReturn) rc;
45 }
46 }
47
48 queue_remove( list, scsiCmd, IOSCSIParallelCommand *, nextCommand );
49 }
50
51 IOSCSIParallelCommand *IOSCSIParallelDevice::checkCommand( queue_head_t *list )
52 {
53 if ( queue_empty( list ) == true )
54 {
55 return 0;
56 }
57
58 return (IOSCSIParallelCommand *)queue_first( list );
59 }
60
61
62 IOSCSIParallelCommand *IOSCSIParallelDevice::getCommand( queue_head_t *list )
63 {
64 IOSCSIParallelCommand *scsiCmd = 0;
65
66 if ( queue_empty( list ) == false )
67 {
68 queue_remove_first( list, scsiCmd, IOSCSIParallelCommand *, nextCommand );
69 scsiCmd->list = 0;
70 }
71
72 return scsiCmd;
73 }
74
75 void IOSCSIParallelDevice::stackCommand( queue_head_t *list, IOSCSIParallelCommand *scsiCmd )
76 {
77 scsiCmd->list = list;
78
79 queue_enter_first( list, scsiCmd, IOSCSIParallelCommand *, nextCommand );
80 }
81
82 void IOSCSIParallelDevice::moveCommand( queue_head_t *fromList, queue_head_t *toList, IOSCSIParallelCommand *scsiCmd, IOReturn rc = kIOReturnSuccess )
83 {
84 if ( rc != kIOReturnSuccess )
85 {
86 if ( scsiCmd->results.returnCode == kIOReturnSuccess )
87 {
88 scsiCmd->results.returnCode = (IOReturn) rc;
89 }
90 }
91
92 scsiCmd->list = toList;
93
94 queue_remove( fromList, scsiCmd, IOSCSIParallelCommand *, nextCommand );
95 queue_enter( toList, scsiCmd, IOSCSIParallelCommand *, nextCommand );
96 }
97
98 void IOSCSIParallelDevice::moveAllCommands( queue_head_t *fromList, queue_head_t *toList, IOReturn rc = kIOReturnSuccess )
99 {
100 IOSCSIParallelCommand *scsiCmd;
101
102 if ( queue_empty( fromList ) == true ) return;
103
104 do
105 {
106 scsiCmd = (IOSCSIParallelCommand *)queue_first( fromList );
107
108 if ( rc != kIOReturnSuccess )
109 {
110 if ( scsiCmd->results.returnCode == kIOReturnSuccess )
111 {
112 scsiCmd->results.returnCode = (IOReturn) rc;
113 }
114 }
115
116 scsiCmd->list = toList;
117
118 queue_remove( fromList, scsiCmd, IOSCSIParallelCommand *, nextCommand );
119 queue_enter( toList, scsiCmd, IOSCSIParallelCommand *, nextCommand );
120
121 } while( queue_empty( fromList ) == false );
122 }
123
124 bool IOSCSIParallelDevice::findCommand( queue_head_t *list, IOSCSIParallelCommand *findSCSICmd )
125 {
126 IOSCSIParallelCommand *scsiCmd;
127
128 queue_iterate( list, scsiCmd, IOSCSIParallelCommand *, nextCommand )
129 {
130 if ( scsiCmd == findSCSICmd )
131 {
132 return true;
133 }
134 }
135 return false;
136 }
137
138 void IOSCSIParallelDevice::purgeAllCommands( queue_head_t *list, IOReturn rc )
139 {
140 IOSCSIParallelCommand *scsiCmd;
141
142 if ( queue_empty( list ) == true ) return;
143
144 do
145 {
146 scsiCmd = (IOSCSIParallelCommand *)queue_first( list );
147
148 deleteCommand( list, scsiCmd, rc );
149 finishCommand( scsiCmd );
150
151 } while( queue_empty( list ) == false );
152 }