|
|
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 IOSCSICommand_Reference.h
26:
27: This header defines the IOSCSICommand class.
28:
29: This class encapsulates a SCSI Command. The client driver allocates a
30: command using IOSCSIDevice::allocCommand() and initializes it using
31: functions of this class. The client can then submit the command to
32: the SCSI stack by invoking the execute() function.
33: */
34:
35:
36: /*!
37: @enum SCSICDBFlags
38: Defines values for the cdbFlags field in the SCSICDBInfo structure.
39: @constant kCDBFNoDisconnect
40: Set by the IOSCSIDevice client to indicate the target may not disconnect
41: during the execution of this IOSCSICommand.
42: @constant kCDBFlagsDisableParity
43: Set by the IOSCSIController class to tell the host adapter driver to disable
44: parity checking during the execution of this CDB.
45: @constant kCDBFlagsNoDisconnect
46: Set by the IOSCSIController class to tell the host adapter driver that the
47: target may not disconnect during the execution of this IOSCSICommand.
48: @constant kCDBFlagsNegotiateSDTR
49: Set by the IOSCSIController class to tell the host adapter driver that it
50: should initiate synchronous data transfer negotiation during this IOSCSICommand.
51: @constant kCDBFlagsNegotiateWDTR
52: Set by the IOSCSIController class to tell the host adapter driver that it
53: should initiate wide data transfer negotiation during this IOSCSICommand.
54: */
55: enum SCSICDBFlags {
56: kCDBFNoDisconnect = 0x00000001,
57:
58: /*
59: * Note: These flags are for IOSCSIController subclasses only
60: */
61: kCDBFlagsDisableParity = 0x08000000,
62: kCDBFlagsNoDisconnect = 0x10000000,
63: kCDBFlagsNegotiateSDTR = 0x20000000,
64: kCDBFlagsNegotiateWDTR = 0x40000000,
65: };
66:
67:
68: /*!
69: @enum SCSIAdapterStatus
70: Defines the values of the adapterStatus field of the SCSIResults structure.
71: @constant kSCSIAdapterStatusSuccess
72: Request completed with no adapter reported errors.
73: @constant kSCSIAdapterStatusMsgReject
74: Adapter received a msg reject from the target device.
75: @constant kSCSIAdapterStatusParityError
76: Adapter detected, or target reported a parity error during the
77: IOSCSICommand.
78: */
79: enum SCSIAdapterStatus {
80: kSCSIAdapterStatusSuccess = 0,
81: kSCSIAdapterStatusMsgReject,
82: kSCSIAdapterStatusParityError,
83: };
84:
85:
86: /*!
87: @typedef SCSICDBInfo
88: @discussion
89: Fields specified here are set by IOSCSIDevice client, while others
90: are set by the IOSCSIController class for use by the host adapter
91: driver. The client should zero all fields of the structure prior
92: to use.
93: @field cdbFlags
94: See enum SCSICDBFlags for flag definitions.
95: @field cdbTagMsg
96: This field should be set to zero by the IOSCSIDevice client. If the
97: SCSI device supports tag queuing then the IOSCSIController class
98: will set this field to select simple (unordered) tags.
99: @field cdbTag
100: This field is set by the IOSCSIController class to tell the host
101: adapter driver the SCSI tag value to assign to this IOSCSICommand.
102: @field cdbLength
103: Set by the IOSCSIDevice client to the length of the Command Descriptor
104: Block (CDB).
105: @field cdb
106: Set by the IOSCSIDevice client to command descriptor block the client
107: wishes the target to execute.
108: */
109: typedef struct SCSICDBInfo {
110:
111: UInt32 cdbFlags;
112:
113: UInt32 cdbTagMsg;
114: UInt32 cdbTag;
115:
116: UInt32 cdbAbortMsg;
117:
118: UInt32 cdbLength;
119: UInt8 cdb[16];
120:
121: UInt32 reserved[16];
122: } SCSICDBInfo;
123:
124:
125: /*!
126: @typedef SCSIResults
127: @field returnCode
128: The overall return code for the command. See iokit/iokit/IOReturn.h.
129: This value is also returned as the getResults() return value.
130:
131: Note: The exact subset of return codes a SCSI command will return is
132: currently under review.
133: @field bytesTransferred
134: The total number of bytes transferred to/from the target device.
135: @field adapterStatus
136: This field provides additional adapter reported error information. The SCSI
137: Family uses this information to determine whether the target rejected a
138: negotiation attempt (either/or) wide or synchronous.
139: @field scsiStatus
140: The SCSI Status byte returned from the target device.
141: @field requestSenseDone
142: A boolean indicating whether sense data was obtained from the target
143: device.
144: @field requestSenseLength
145: The number of sense data bytes returned from the target device.
146: */
147: typedef struct SCSIResults {
148: IOReturn returnCode;
149:
150: UInt32 bytesTransferred;
151:
152: UInt32 adapterStatus;
153: UInt8 scsiStatus;
154:
155: bool requestSenseDone;
156: UInt32 requestSenseLength;
157: } SCSIResults;
158:
159:
160: /*!
161: @enum SCSIQueueType
162: Each IOSCSIDevice has two queues, a normal Q and a bypass Q. The treatment of the
163: queues is essentially identical except that the bypass Q is given preference whenever
164: it has commands available.
165:
166: Usually, the client will use the normal Q for regular I/O commands and the bypass Q
167: to send error recovery commands to the device.
168: @constant kQTypeNormalQ
169: Indicates command applies to the normal IOSCSIDevice queue.
170: @constant kQTypeBypassQ
171: Indicates command applies to the bypass IOSCSIDevice queue.
172: */
173: enum SCSIQueueType {
174: kQTypeNormalQ = 0,
175: kQTypeBypassQ = 1,
176: };
177:
178:
179: /*!
180: @enum SCSIQueuePosition
181: Indicates whether a IOSCSICommand should be added to the head or tail
182: of the queue selected.
183: @constant kQPositionTail
184: Queue request at the tail (end) of the selected queue.
185: @constant kQPositionHead
186: Queue request at the head (front) of the selected queue.
187: */
188: enum SCSIQueuePosition {
189: kQPositionTail = 0,
190: kQPositionHead = 1,
191: };
192:
193:
194: /*!
195: @struct SCSITargetLun
196: @field target
197: The SCSI Id for the SCSI device being selected.
198: @field lun
199: The SCSI Lun for the SCSI device being selected.
200: */
201: typedef struct SCSITargetLun {
202: UInt8 target;
203: UInt8 lun;
204: UInt8 reserved[2];
205: } SCSITargetLun;
206:
207: /*!
208: @class IOSCSICommand : public IOCDBCommand
209: @abstract
210: Class that describes a SCSI device (target/lun pair).
211: @discussion
212: This class encapsulates a SCSI Command. The client driver allocates a
213: command using IOSCSIDevice::allocCommand() and initializes it using
214: functions of this class. The client can then submit the command to
215: the SCSI stack by invoking the execute() function.
216: */
217: class IOSCSICommand : public IOCDBCommand
218: {
219: public:
220:
221:
222: /*!
223: @function setPointers
224: @abstract
225: Sets the data buffer component of a SCSI Command.
226: @discussion
227: The client provides an IOMemoryDescriptor object to corresponding
228: to the client's data or request sense buffer, the maximum data transfer count
229: and data transfer direction.
230: @param desc
231: Pointer to a IOMemoryDescriptor describing the client's I/O buffer.
232: @param transferCount
233: Maximum data transfer count in bytes.
234: @param isWrite
235: Data transfer direction. (Defined with respect to the device, i.e. isWrite = true
236: indicates the host is writing to the device.
237: @param isSense
238: If isSense is set to true, the IOSCSICommand's data buffer information is set. Otherwise,
239: the IOSCSICommand's request sense buffer information is set
240: */
241: void setPointers( IOMemoryDescriptor *desc, UInt32 transferCount, bool isWrite, bool isSense=false );
242:
243:
244: /*!
245: @function getPointers
246: @abstract
247: Gets the data buffer component of a SCSI Command.
248: @discussion
249: The client provides a set of pointers to fields to receive the IOSCSICommand's
250: data/request sense buffer pointers.
251: @param desc
252: Pointer to a field (IOMemoryDescriptor *) to receive the IOSCSICommand's IOMemoryDescriptor pointer.
253: @param transferCount
254: Pointer to a field (UInt32) to receive the IOSCSICommand's maximum transfer count.
255: @param isWrite
256: Pointer to a field (bool) to receive the IOSCSICommand's transfer direction.
257: @param isSense
258: If isSense is set to true, the IOSCSICommand's data buffer information is returned. Otherwise,
259: the IOSCSICommand's request sense buffer information is returned.
260: */
261: void getPointers( IOMemoryDescriptor **desc, UInt32 *transferCount, bool *isWrite, bool isSense = false );
262:
263: /*!
264: @function setTimeout
265: @abstract
266: Sets the timeout for the command in milliseconds.
267: @discussion
268: The IOSCSIController class will abort a command which does not
269: complete with in the time interval specified. The client should
270: set the timeout parameter to zero if they want to suppress
271: timing.
272: @param timeout
273: Command timeout in milliseconds.
274: */
275: void setTimeout( UInt32 timeoutmS );
276:
277: /*!
278: @function getTimeout
279: @abstract
280: Gets the timeout for the command in milliseconds.
281: @discussion
282: This function returns the command timeout previously set by setTimeout().
283: @param timeout
284: Command timeout in milliseconds.
285: */
286: UInt32 getTimeout();
287:
288:
289: /*!
290: @function setCallback
291: @abstract
292: Sets the callback routine to be invoked when the SCSI Command completes.
293: @param target
294: Pointer to the object to be passed to the callback routine. This would usually
295: be the client's (this) pointer.
296: @param callback
297: Pointer to the client's function to process the completed command
298: @param refcon
299: Pointer to the information required by the client's callback routine to process
300: the completed command.
301: */
302: void setCallback( void *target = 0, CallbackFn callback = 0, void *refcon = 0 );
303:
304:
305: /*!
306: @function getClientData
307: @abstract
308: Returns a pointer to the SCSI Command's client data area.
309: @discussion
310: The client may allocate storage in the SCSI Command for its own use.
311: See IOSCSIDevice::allocateCmd().
312: */
313: void *getClientData();
314:
315: /*
316: @function getCommandData
317: @abstract
318: Returns a pointer to the SCSI Command's controller data area
319: @discussion
320: This area is allocated for use by the IOSCSIController subclass (host adapter
321: driver). The client should not normally access this area.
322: */
323: void *getCommandData();
324:
325:
326: /*!
327: @function setCDB
328: @abstract
329: Sets the CDB component of a SCSI Command.
330: @param scsiCDB
331: Pointer to a SCSICDBInfo structure.
332: */
333: void setCDB( SCSICDBInfo *scsiCmd );
334:
335:
336: /*!
337: @function getCDB
338: @abstract
339: Gets the CDB component of a SCSI Command.
340: @param scsiCDB
341: Pointer to a SCSICDBInfo structure to receive the SCSI Command's cdb information.
342: */
343: void getCDB( SCSICDBInfo *scsiCmd );
344:
345:
346: /*!
347: @function getResults
348: @abstract
349: Gets results from a completed SCSI Command.
350: @discussion
351: The getResults() function returns the value of the returnCode field of the command results. If
352: the client is only interested in a pass/fail indication for the command, the client
353: can pass (SCSIResult *)0 as a parameter.
354: @param results
355: Pointer to a SCSIResults structure to receive the SCSI Commands completion information.
356: */
357: IOReturn getResults( SCSIResults *results );
358:
359: /*!
360: @function setResults
361: @abstract
362: Sets the results component of a SCSI Command.
363: @discussion
364: The setResults() function is used by the IOSCSIController subclass (host
365: adapter driver) return results for a SCSI Command about to be completed.
366: @param scsiResults Pointer to a SCSIResults structure containing
367: completion information for the SCSI Command.
368:
369: Completion information is copied into the command, so the caller may
370: release the SCSIResults structure provided when this function returns.
371: */
372: void setResults( SCSIResults *results );
373:
374:
375: /*!
376: @function getDevice
377: @abstract
378: Returns the IOSCSIDevice this command is targeted to.
379: @param deviceType
380: The caller should use value kIOSCSIDeviceType.
381: @discussion
382: In some cases a IOSCSICommand is not associated with a specific target/lun. This
383: would be the case for a SCSI Bus Reset. In this case getDevice() returns 0.
384: */
385: IOSCSIDevice *getDevice( IOSCSIDevice *deviceType );
386:
387:
388: /*!
389: @function getTargetLun
390: @abstract
391: Returns the target/lun for the IOSCSIDevice this command is associated with.
392: @param targetLun
393: Pointer to a SCSITargetLun structure to receive the target/lun information.
394: */
395: void getTargetLun( SCSITargetLun *targetLun );
396:
397:
398: /*!
399: @function execute
400: @abstract
401: Submits a SCSI command to be executed.
402: @discussion
403: Once the execute() function is called, the client should not
404: invoke any further functions on the SCSI Command with the
405: exception of abort().
406:
407: The execute() function optionally returns sets a unique sequence
408: number token for the command. If the client intends to use the abort()
409: method they must retain this sequence number token.
410: @param sequenceNumber
411: Pointer to field (UInt32) to receive the sequence number assigned to the SCSI
412: Command.
413: */
414: bool execute( UInt32 *sequenceNumber = 0 );
415:
416: /*!
417: @function abort
418: @abstract
419: Aborts an executing SCSI Command.
420: @discussion
421: The client may invoke the abort() method to force the completion of an
422: executing SCSI Command. The client must pass the sequence number
423: provided when the execute() function was invoked.
424:
425: Note: The abort function provides no status on whether or not a
426: command has been successfully aborted. The client should wait for the
427: command to actually complete to determine whether the abort completed
428: successfully.
429: @param sequenceNumber
430: The client must pass the sequence number assigned to the command when
431: the client called the execute() function.
432: */
433: void abort( UInt32 sequenceNumber );
434:
435: /*!
436: @function complete
437: @abstract
438: Indicates the IOSCSIController subclass (host adapter driver) has completed a SCSI command.
439: @discussion
440: Once the complete() function is called, the controller
441: subclass should make no further accesses to the IOSCSICommand
442: being completed.
443:
444: A IOSCSIDevice client would not normally call this function.
445: */
446: void complete();
447:
448:
449: /*!
450: @function getSequenceNumber
451: @abstract
452: Returns the sequence number assigned to an executing command.
453: @discussion
454: The caller should check the sequence number for 0. This indicates that
455: the command has completed or has not been processed to the point where
456: a sequence number has been assigned.
457: */
458: UInt32 getSequenceNumber();
459:
460:
461: /*!
462: @function setQueueInfo
463: @abstract
464: Sets queuing information for the SCSI Command.
465: @discussion
466: Each IOSCSIDevice has two queues, a normal Q and a bypass Q. The treatment of the
467: queues is esentially identical except that the bypass Q is given preference whenever
468: it has commands available.
469:
470: Usually, the client will use the normal Q for regular I/O commands and the bypass Q
471: to send error recovery commands to the device.
472: @param queueType
473: Set to kQTypeNormalQ or kQTypeBypassQ to indicate which IOSCSIDevice queue the
474: SCSI Command should be routed to.
475: @param queuePosition
476: Set to kQPositionTail or kQPositionHead to indicate whether the SCSI Command should
477: be added to the head to tail for the selected IOSCSIDevice queue.
478: */
479: void setQueueInfo( UInt32 queueType = kQTypeNormalQ, UInt32 queuePosition = kQPositionTail );
480:
481:
482: /*!
483: @function getQueueInfo
484: @abstract
485: Gets queuing information for the SCSI Command.
486: @param queueType
487: Pointer to a field (UInt32) to receive the queue type previously set for this SCSI Command.
488: @param queuePosition
489: Pointer to a field (UInt32) to receive the queue position previously set for this SCSI Command.
490: */
491: void getQueueInfo( UInt32 *queueType, UInt32 *queuePosition = 0 );
492:
493:
494: /*!
495: @function getCmdType
496: @abstract
497: Obtains the underlying 'intent' of a SCSI Command.
498: @discussion
499: This function provides information on the intent of a SCSI
500: Command. For example, since Aborts, Request Sense and normal Execute commands are
501: all sent to the executeCommand() function, invoking getCmdType()
502: will indicate whether a Request Sense, Abort or Normal I/O request is
503: being processed.
504:
505: It this information is not normally meaningful to IOSCSIDevice clients.
506: */
507: UInt32 getCmdType();
508:
509:
510: /*!
511: @function getOriginalCmd
512: @abstract
513: Obtains a 'related' SCSI Command.
514: @discussion
515: In cases where a SCSI command is related to a previous command, this
516: function will return the original command. For example, if a
517: Request Sense command (CmdType = kSCSICommandReqSense)is processed,
518: then this function can be used to obtain the original command that
519: caused the check condition. If an Abort command (CmdType =
520: kSCSICommandAbort) then this function can be used to obtain the original
521: command the abort was issued against.
522:
523:
524: It this information is not normally meaningful to IOSCSIDevice clients.
525: */
526: IOSCSICommand *getOriginalCmd();
527:
528: };
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.