|
|
1.1 root 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: /*!
25: @header IOSCSIDevice_Reference.h
26:
27: This header defines the IOSCSIDevice class.
28:
29: The SCSI framework creates instances of this class to
30: represent each valid SCSI device (target/lun) detected during
31: SCSI bus scanning. When an instance of this class is registered with
32: IOKit, the instance will be presented to clients which
33: 'match' the IOSCSIDevice class.
34: */
35:
36: /*!
37: @typedef SCSITargetParms
38: Parameter structure for get/setTargetParms
39: @field transferPeriodpS
40: Minimum SCSI synchronous transfer period allowed
41: for this target in picoseconds (10E-12). For asynchronous data transfer,
42: set this field to 0.
43: @field transferOffset
44: Maximum SCSI synchronous transfer offset allowed for this target in
45: bytes. For asynchronous data transfer, set this field to 0.
46: @field transferWidth
47: Maximum SCSI bus width in bytes. Note: must be a
48: power of 2.
49: @field enableTagQueuing
50: Setting enableTagQueuing to true enables tag queuing for SCSI Commands
51: issued to the target.
52: @field disableParity
53: Set to (true) to disable parity checking on the
54: SCSI bus for this target.
55: */
56: typedef struct SCSITargetParms {
57: UInt32 transferPeriodpS;
58: UInt32 transferOffset;
59: UInt32 transferWidth;
60:
61: bool enableTagQueuing;
62: bool disableParity;
63:
64: UInt32 reserved[16];
65:
66: } SCSITargetParms;
67:
68:
69: /*!
70: @typedef SCSILunParms
71: Parameter structure for get/setLunParms
72: @field disableDisconnect
73: Setting disableDisconnect to true disables SCSI disconnect for SCSI
74: Commands issued to the target/lun pair.
75: */
76: typedef struct SCSILunParms {
77: bool disableDisconnect;
78:
79: UInt32 reserved[16];
80:
81: } SCSILunParms;
82:
83:
84: /*!
85: @enum SCSIClientMessage
86: @discussion
87: IOSCSIDevice notifies its client of significant 'events' by the IOService::message()
88: api. When possible the client is notified of the event prior to any action taken. The
89: client is responsible for managing the device queue for the IOSCSIDevice
90: via the holdQueue(), releaseQueue(), flushQueue() and notifyIdle() api's. The client is also
91: notified at the end of an 'event' by the corresponding message id with or'd with
92: kClientMsgDone.
93: @constant kClientMsgDeviceAbort
94: A client initiated device abort is beginning.
95: @constant kClientMsgDeviceReset
96: A client initiated device reset is beginning.
97: @constant kClientMsgBusReset
98: An unsolicited bus reset has occurred.
99: @constant kClientMsgDone
100: This constant is or'd with one of the above message ids to indicate the
101: client should complete processing of the corresponding event.
102: */
103: enum SCSIClientMessage {
104: kClientMsgDeviceAbort = 0x00005000,
105: kClientMsgDeviceReset,
106: kClientMsgBusReset,
107:
108: kClientMsgDone = 0x80000000,
109: };
110:
111:
112: /*!
113: @class IOSCSIDevice : public IOCDBDevice
114: @abstract
115: Class that describes a SCSI device (target/lun pair).
116: @discussion
117: The IOSCSIDevice class provides basic services
118: to initialize and supervise a SCSI device. Once the device is
119: initialized, the client will normally use the allocCommand() member
120: function to create IOSCSICommand(s) to send SCSI CDBs to the target/lun.
121: */
122: class IOSCSIDevice : public IOCDBDevice
123: {
124: public:
125:
126: /*!
127: @function allocCommand
128: @abstract
129: Allocates a IOSCSICommand object for this device.
130: @discussion
131: The client uses the allocCommand() member function to allocate IOSCSICommand(s)
132: for a IOSCSIDevice. The client then uses the member functions of
133: the IOSCSICommand to initialize it and send it to the device. A completed IOSCSICommand
134: may be reused for subsequent I/O requests or returned to the SCSI Family.
135: @param scsiDevice
136: Always specify kIOSCSIDevice.
137: @param clientDataSize
138: The client may indicate the size of a per-command data area for its own
139: use.
140:
141: Note: The amount of per-command storage allowed is under review. We
142: anticipate that typical SCSI clients will need not more than 1024 bytes
143: per command.
144: */
145: IOSCSICommand *allocCommand( IOSCSIDevice *scsiDevice, UInt32 clientDataSize = 0 );
146:
147:
148: /*!
149: @function setTargetParms
150: @abstract
151: Sets SCSI parameters that apply to all luns on a SCSI target device.
152: @discussion
153: This function will block until we attempt to set the
154: requested parameters. It may not be called from the device's workloop context.
155:
156: The SCSI Family will serialize accesses to the SCSI
157: target so as not to disrupt commands in progress prior to processing a
158: change of target parameters.
159: @param targetParms
160: Pointer to structure of type SCSITargetParms.
161: */
162: bool setTargetParms( SCSITargetParms *targetParms );
163:
164:
165: /*!
166: @function getTargetParms
167: @abstract
168: Gets the current target parameters.
169: @discussion
170: Returns the parameters currently in effect for the SCSI target.
171: See setTargetParms().
172: @param targetParms
173: Pointer to structure of type SCSITargetParms.
174: */
175: void getTargetParms( SCSITargetParms *targetParms );
176:
177:
178: /*!
179: @function setLunParms
180: @abstract
181: Sets the logical unit parameters for this device.
182: @discussion
183: This function will block until we attempt to set the
184: requested parameters. It may not be called from the device's workloop context.
185:
186: The SCSI Family will serialize accesses to the SCSI
187: target/lun so as not to disrupt commands in progress prior to processing a
188: change of lun parameters.
189: @param lunParms
190: Pointer to structure of type SCSILunParms
191: */
192: bool setLunParms( SCSILunParms *lunParms );
193:
194:
195: /*!
196: @function getLunParms
197: @abstract
198: Gets the current logical unit parameters.
199: @discussion
200: Returns the parameters currently in effect for the SCSI target/lun.
201: @param lunParms
202: Pointer to structure of type SCSITargetParms
203: */
204: void getLunParms( SCSILunParms *lunParms );
205:
206:
207: /*!
208: @function abort
209: @abstract
210: Aborts all outstanding requests for the target/lun pair.
211: @discussion
212: If any I/O requests are currently active for the target/lun, an abort
213: command is sent to the device and any active requests are completed.
214:
215: Prior to abort processing beginning, the client will be notified via:
216:
217: message( kClientMsgDeviceAbort );
218:
219: When abort processing is completed, the client will be notified via:
220:
221: message( kClientMsgDeviceAbort | kClientMsgDone );
222:
223: The client is responsible for managing the pending work queue for
224: the device when an abort request occurs. See holdQueue(), flushQueue(),
225: notifyIdle() functions.
226: */
227: void abort();
228:
229:
230: /*!
231: @function reset
232: @abstract
233: Resets the SCSI target.
234: @discussion
235: Since a SCSI target may have multiple logical units (lun(s)) the
236: reset() function may affect multiple IOSCSIDevice instances. Processing for
237: each lun is similar.
238:
239: Prior to reset processing beginning, the client will be notified via:
240:
241: message( kClientMsgDeviceReset );
242:
243: When reset processing is completed, the client will be notified via:
244:
245: message( kClientMsgDeviceReset | kClientMsgDone );
246:
247: The client is responsible for managing the pending work queue for
248: the device when an abort request occurs. See holdQueue(), flushQueue(),
249: notifyIdle() functions.
250: */
251: void reset();
252:
253:
254: /*!
255: @function getInquiryData
256: @abstract Returns SCSI Inquiry data for the IOSCSIDevice.
257: @discussion
258: Inquiry data returned is from the results of the last SCSI bus probe.
259: @param inquiryBuffer
260: Pointer to a buffer to receive the Inquiry data.
261: @param inquiryBufSize
262: Size of the buffer supplied.
263: @param inquiryDataSize
264: Pointer to a UInt32 to receive the size of the Inquiry data actually
265: returned.
266: */
267: void getInquiryData( void *inquiryBuffer, UInt32 inquiryBufSize, UInt32 *inquiryDataSize );
268:
269:
270: /*!
271: @function message
272: @abstract
273: IOService message function.
274: @discussion
275: IOSCSIDevice notifies its client of significant 'events' by the IOService::message()
276: api. When possible the client is notified of the event prior to any action taken. The
277: client is responsible for managing the device queue for the IOSCSIDevice
278: via the holdQueue(), releaseQueue(), flushQueue() and notifyIdle() api's.
279:
280: Any return codes provided by the client are ignored.
281: @param message-id
282: Message id's for IOSCSIDevice are defined by enum SCSIClientMessage
283: @param provider
284: Pointer to the IOSCSIDevice reporting the event.
285: @param argument
286: Unused.
287: */
288: IOReturn message( UInt32 type, IOService * provider, void * argument = 0 );
289:
290:
291: /*!
292: @function open
293: @abstract
294: IOService open function
295: @discussion
296: A client should open a IOSCSIDevice prior to accessing it. Only one open is allowed
297: per device.
298: @param client
299: Pointer to the IOSCSI device the client is opening.
300: @param options
301: There are currently no options defined by the SCSI Family.
302: @param arg
303: Unused. Omit or specify 0.
304: */
305: bool open( IOService *client, IOOptionBits options = 0, void *arg = 0 );
306:
307:
308: /*!
309: @function close
310: @abstract
311: IOService close function
312: @discussion
313: A client must close a IOSCSIDevice if the client plans no further accesses to it.
314: @param client
315: Pointer to the IOSCSI device the client is closing.
316: @param options
317: There are currently no options defined by the SCSI Family.
318: */
319: void close( IOService *client, IOOptionBits options = 0 );
320:
321:
322: /*!
323: @function holdQueue
324: @abstract
325: Suspends sending additional IOSCSICommands to the target/lun.
326: @discussion
327: holdQueue() may only be called from the IOSCSIDevice workloop. The client
328: is guaranteed to be running in this context during a message() notification.
329:
330: holdQueue() has no effect on commands already passed to the host adapter. One
331: or more commands may complete after the queue is held. See notifyIdle()
332: @param queueType
333: Perform action on the indicated queue. See enum SCSIQueueType in IOSCSICommand.
334: */
335: holdQueue( UInt32 queueType );
336:
337:
338: /*!
339: @function flushQueue
340: @abstract
341: Returns any commands on the IOSCSIDevice's pending work queue.
342: @discussion
343: flushQueue() may only be called from the IOSCSIDevice workloop. This is
344: guaranteed to be the case after a IOSCSICommand completion of after a
345: message() notification.
346:
347: All pending command are completed prior to flushQueue() returning to the caller.
348:
349: flushQueue() has no effect on commands already passed to the host adapter. One
350: or more commands may complete after the queue is flushed. See notifyIdle().
351: @param queueType
352: Perform action on the indicated queue. See enum SCSIQueueType in IOSCSICommand.
353: @param rc
354: The return code of any flushed commands is set to (rc).
355: */
356: void flushQueue( UInt32 queueType, IOReturn rc );
357:
358:
359: /*!
360: @function notifyIdle
361: @abstract
362: Notifies the client when all active commands on a SCSI device have completed.
363: @discussion
364: notifyIdle() may only be called from the IOSCSIDevice workloop. This is guaranteed
365: to be the case after a IOSCSICommand completion of after a message() notification.
366:
367: Only one notifyIdle() call may be active. Any outstanding notifyIdle() calls may
368: be cancelled by calling notifyIdle() with no parameters.
369: @param target
370: Object to receive the notification. Normally the client's (this) pointer.
371: @param callback
372: Pointer to a callback routine of type CallbackFn.
373: @param refcon
374: Pointer to client's private data.
375: */
376: void notifyIdle( void *target, Callback callback, void *refcon );
377:
378:
379: /*!
380: @function releaseQueue
381: @abstract
382: Resumes sending IOSCSICommands to the IOSCSIDevice.
383: @discussion
384: If the device queue was not held, releaseQueue() has no effect.
385:
386: releaseQueue() may only be called from the IOSCSIDevice workloop. This is guaranteed
387: to be the case after a IOSCSICommand completion of after a message() notification.
388: @param queueType
389: Perform action on the indicated queue. See enum SCSIQueueType in IOSCSICommand.
390: */
391: void releaseQueue( UInt32 queueType );
392:
393:
394: /*!
395: @function getWorkLoop
396: @abstract
397: Returns the IOWorkLoop object that services this IOSCSIDevice.
398: */
399: IOWorkloop *getWorkLoop();
400:
401: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.