|
|
1.1 root 1: /*
2: * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
3: *
4: * @APPLE_LICENSE_HEADER_START@
5: *
6: * Portions Copyright (c) 1999 Apple Computer, Inc. All Rights
7: * Reserved. This file contains Original Code and/or Modifications of
8: * Original Code as defined in and that are subject to the Apple Public
9: * Source License Version 1.1 (the "License"). You may not use this file
10: * except in compliance with the License. Please obtain a copy of the
11: * License at http://www.apple.com/publicsource and read it before using
12: * this file.
13: *
14: * The Original Code and all software distributed under the License are
15: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
16: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
17: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
18: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
19: * License for the specific language governing rights and limitations
20: * under the License.
21: *
22: * @APPLE_LICENSE_HEADER_END@
23: */
24:
25: /*
26: File: uslPipeState.c
27:
28: Contains: xxx put contents here xxx
29:
30: Version: xxx put version here xxx
31:
32: Copyright: � 1998 by Apple Computer, Inc., all rights reserved.
33:
34: File Ownership:
35:
36: DRI: xxx put dri here xxx
37:
38: Other Contact: xxx put other contact here xxx
39:
40: Technology: xxx put technology here xxx
41:
42: Writers:
43:
44: (BT) Barry Twycross
45:
46: Change History (most recent first):
47:
48: <USB3> 8/13/98 BT Add multibus support
49: <USB2> 7/28/98 BT Fix spurious errors
50: <USB1> 4/26/98 BT first checked in
51: */
52:
53: #include "../USB.h"
54: #include "../USBpriv.h"
55:
56: #include "uslpriv.h"
57: #include "../uimpriv.h"
58:
59: void uslSetPipeStall(USBPipeRef ref)
60: {
61: pipe *thisPipe;
62: OSStatus err = noErr;
63: err = findPipe(ref, &thisPipe);
64: if(thisPipe != nil)
65: {
66: if(thisPipe->state == kUSBActive)
67: {
68: thisPipe->state = kUSBStalled;
69: }
70: else if(thisPipe->state == kUSBIdle)
71: {
72: thisPipe->state = kUSBIdleStalled;
73: }
74: }
75:
76: }
77:
78: OSStatus USBAbortPipeByReference(USBReference refIn)
79: {
80: pipe *thisPipe;
81: USBReference ref;
82: OSStatus err = noErr;
83:
84: do{
85: /* Is this a device ref ? */
86: ref = getPipeZero(refIn);
87: if(ref == 0)
88: {
89: /* No, is it a pipe ref? */
90: ref = refIn;
91: }
92: /* Find the pipe struct */
93: err = findPipe(ref, &thisPipe);
94: if(thisPipe == nil)
95: {
96: break;
97: }
98:
99: err = UIMAbortEndpoint(thisPipe->bus, thisPipe->devAddress, thisPipe->endPt, thisPipe->direction);
100: }while(0);
101:
102: return(err);
103: }
104:
105: OSStatus USBClearPipeStallByReference(USBPipeRef ref)
106: {
107: pipe *thisPipe;
108: OSStatus err = noErr;
109:
110: do{
111: /* Note this can't be a device ref, they're automatically cleared */
112: /* Find the pipe struct */
113: err = findPipe(ref, &thisPipe);
114: if(err != kUSBPipeStalledError)
115: {
116: break;
117: }
118:
119: err = UIMClearEndPointStall(thisPipe->bus, thisPipe->devAddress, thisPipe->endPt, thisPipe->direction);
120: if(err == noErr)
121: {
122: if(thisPipe->state == kUSBIdleStalled)
123: {
124: thisPipe->state = kUSBIdle;
125: }
126: else
127: {
128: thisPipe->state = kUSBActive;
129: }
130: }
131: }while(0);
132:
133: return(err);
134: }
135:
136: OSStatus USBSetPipeIdleByReference(USBPipeRef ref)
137: {
138: pipe *thisPipe;
139: OSStatus err = noErr;
140:
141: do{
142: /* Note this can't be a device ref, they're automatically cleared */
143: /* Find the pipe struct */
144: err = findPipe(ref, &thisPipe);
145: if(thisPipe == nil)
146: {
147: break;
148: }
149:
150: err = noErr;
151:
152: if(thisPipe->state == kUSBStalled)
153: {
154: thisPipe->state = kUSBIdleStalled;
155: }
156: else
157: {
158: thisPipe->state = kUSBIdle;
159: }
160: }while(0);
161:
162: return(err);
163: }
164:
165: OSStatus USBSetPipeActiveByReference(USBPipeRef ref)
166: {
167: pipe *thisPipe;
168: OSStatus err = noErr;
169:
170: do{
171: /* Note this can't be a device ref, they're automatically cleared */
172: /* Find the pipe struct */
173: err = findPipe(ref, &thisPipe);
174: if(thisPipe == nil)
175: {
176: break;
177: }
178:
179: if(thisPipe->state == kUSBIdleStalled)
180: {
181: thisPipe->state = kUSBStalled;
182: // do nothing, err is stalled err.
183: }
184: else if(thisPipe->state == kUSBStalled)
185: {
186: // do nothing, err is stalled err.
187: }
188: else if(thisPipe->state == kUSBIdle)
189: {
190: thisPipe->state = kUSBActive;
191: err = noErr;
192: }
193:
194: }while(0);
195:
196: return(err);
197: }
198:
199:
200:
201: OSStatus USBResetPipeByReference(USBReference refIn)
202: {
203: pipe *thisPipe;
204: USBReference ref;
205: OSStatus err = noErr;
206:
207: do{
208: /* Is this a device ref ? */
209: ref = getPipeZero(refIn);
210: if(ref == 0)
211: {
212: /* No, is it a pipe ref? */
213: ref = refIn;
214: }
215: /* Find the pipe struct */
216: err = findPipe(ref, &thisPipe);
217: if(thisPipe == nil)
218: {
219: break;
220: }
221: if(err == kUSBPipeStalledError)
222: {
223: err = USBClearPipeStallByReference(ref);
224: }
225: else
226: {
227: err = noErr;
228: }
229: if(err == noErr)
230: {
231: thisPipe->state = kUSBActive;
232: }
233:
234: }while(0);
235:
236: return(err);
237: }
238:
239: OSStatus USBClosePipeByReference(USBPipeRef ref)
240: {
241: pipe *thisPipe;
242: OSStatus err = noErr;
243:
244: do{
245: /* Note this can't be a device ref, they're automatically cleared */
246: /* Find the pipe struct */
247: err = findPipe(ref, &thisPipe);
248: if(thisPipe == nil)
249: {
250: break;
251: }
252:
253: err = uslClosePipe(recoverPipeIdx(ref));
254: }while(0);
255:
256: return(err);
257: }
258:
259:
260: OSStatus USBGetPipeStatusByReference(USBReference refIn, USBPipeState *state)
261: {
262: pipe *thisPipe;
263: USBReference ref;
264: OSStatus err = noErr;
265:
266: do{
267: /* Is this a device ref ? */
268: ref = getPipeZero(refIn);
269: if(ref == 0)
270: {
271: /* No, is it a pipe ref? */
272: ref = refIn;
273: }
274: /* Find the pipe struct */
275: err = findPipe(ref, &thisPipe);
276: if(thisPipe == nil)
277: {
278: break;
279: }
280:
281: if(thisPipe->state == kUSBIdleStalled)
282: {
283: *state = kUSBStalled;
284: }
285: else
286: {
287: *state = thisPipe->state;
288: }
289:
290: }while(0);
291:
292: return(err);
293: }
294:
295:
296:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.