Source to iokit/IOKit/scsi/scsi-parallel/IOSCSIParallelDevice.h
/*
* Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved.
*
* @APPLE_LICENSE_HEADER_START@
*
* The contents of this file constitute Original Code as defined in and
* are subject to the Apple Public Source License Version 1.1 (the
* "License"). You may not use this file except in compliance with the
* License. Please obtain a copy of the License at
* http://www.apple.com/publicsource and read it before using this file.
*
* This Original Code and all software distributed under the License are
* distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
* EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
* INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
* License for the specific language governing rights and limitations
* under the License.
*
* @APPLE_LICENSE_HEADER_END@
*/
/*
*
* IOSCSIParallelDevice.h
*
*
* Methods in this header provide information about the SCSI device
* the device client driver is submitting the SCSICommand(s) to.
*
* Note: SCSICommand(s) are allocated and freed by methods in this class.
* The remaining methods to setup and submit SCSICommands are defined in
* IOSCSICommand.h
*/
#ifndef _IOSCSIPARALLELDEVICE_H
#define _IOSCSIPARALLELDEVICE_H
class IOSCSIParallelController;
class IOSCSIParallelDevice : public IOSCSIDevice
{
OSDeclareDefaultStructors(IOSCSIParallelDevice)
friend class IOSCSIParallelCommand;
friend class IOSCSIParallelController;
/*------------------Methods provided to IOCDBDevice clients-----------------------*/
public:
/*
* Allocate a CDB Command
*/
IOCDBCommand *allocCommand( IOCDBDevice *deviceType, UInt32 clientDataSize = 0 );
/*
* Abort all outstanding commands on this device
*/
void abort();
/*
* Reset device (also aborts all outstanding commands)
*/
void reset();
/*
* Obtain information about this device
*/
void getInquiryData( void *inquiryBuffer,
UInt32 inquiryBufSize,
UInt32 *inquiryDataSize );
/*------------------Additional methods provided to IOSCSIDevice clients-----------------------*/
public:
/*
* Allocate a SCSICommand
*/
IOSCSICommand *allocCommand( IOSCSIDevice *deviceType, UInt32 clientDataSize = 0 );
/*
* Target management commands
*/
bool setTargetParms( SCSITargetParms *targetParms );
void getTargetParms( SCSITargetParms *targetParms );
/*
* Lun management commands
*/
bool setLunParms( SCSILunParms *lunParms );
void getLunParms( SCSILunParms *lunParms );
/*
* Queue management commands
*/
void holdQueue( UInt32 queueType );
void releaseQueue( UInt32 queueType );
void flushQueue( UInt32 queueType, IOReturn rc );
void notifyIdle( void *target = 0, CallbackFn callback = 0, void *refcon = 0 );
/*
*
*/
IOWorkLoop *getWorkLoop() const;
/*------------------Methods private to the IOSCSIDevice class----------------*/
public:
bool open( IOService *forClient, IOOptionBits options = 0, void *arg = 0 );
void close( IOService *forClient, IOOptionBits options = 0 );
IOReturn message( UInt32 clientMsg, IOService *forProvider, void *forArg = 0 );
bool init( IOSCSIParallelController *forController, SCSITargetLun forTargetLun );
void free();
bool matchPropertyTable( OSDictionary * table );
IOService *matchLocation( IOService * client );
private:
void submitCommand( UInt32 cmdType, IOSCSIParallelCommand *scsiCmd, UInt32 cmdSequenceNumber = 0 );
void receiveCommand( UInt32 cmdType, IOSCSIParallelCommand *scsiCmd, UInt32 cmdSequenceNumber, void *p3 );
IOReturn probeTargetLun();
void setupTarget();
void dispatchRequest();
bool dispatch( UInt32 *dispatchAction );
void abortAllCommands( SCSICommandType abortCmdType );
IOSCSIParallelCommand *findCommandWithNexus( UInt32 tagValue );
void abortCommand( IOSCSIParallelCommand *scsiCmd, UInt32 cmdSequenceNumber );
void completeCommand( IOSCSIParallelCommand *cmd );
void checkIdleNotify();
void executeCommandDone( IOSCSIParallelCommand *scsiCmd );
void executeReqSenseDone( IOSCSIParallelCommand *scsiCmd );
void abortCommandDone( IOSCSIParallelCommand *scsiCmd );
void cancelCommandDone( IOSCSIParallelCommand *scsiCmd );
void finishCommand( IOSCSIParallelCommand *scsiCmd );
OSDictionary *createProperties();
bool addToRegistry( OSDictionary *propTable, OSObject *regObj, char *key );
void stripBlanks( char *d, char *s, UInt32 l );
bool checkDeviceQueue( UInt32 *dispatchAction );
void checkNegotiate( IOSCSIParallelCommand *scsiCmd );
bool checkTag( IOSCSIParallelCommand *scsiCmd );
bool checkReqSense();
bool checkAbortQueue();
void checkCancelQueue();
bool allocTag( UInt32 *tagId );
void freeTag( UInt32 tagId );
void timer();
void resetOccurred( SCSIClientMessage clientMsg );
void resetComplete();
void rescheduleCommand( IOSCSIParallelCommand *scsiCmd );
void addCommand( queue_head_t *list, IOSCSIParallelCommand *scsiCmd );
void stackCommand( queue_head_t *list, IOSCSIParallelCommand *scsiCmd );
void deleteCommand( queue_head_t *list, IOSCSIParallelCommand *scsiCmd, IOReturn rc = kIOReturnSuccess );
IOSCSIParallelCommand *checkCommand( queue_head_t *list );
IOSCSIParallelCommand *getCommand( queue_head_t *list );
void moveCommand( queue_head_t *fromList,
queue_head_t *toList,
IOSCSIParallelCommand *scsiCmd,
IOReturn rc = kIOReturnSuccess );
void moveAllCommands( queue_head_t *fromList, queue_head_t *toList, IOReturn rc = kIOReturnSuccess );
bool findCommand( queue_head_t *list, IOSCSIParallelCommand *findScsiCmd );
void purgeAllCommands( queue_head_t *list, IOReturn rc );
IOSCSIParallelCommand *allocCommand( IOSCSIParallelDevice *deviceType, UInt32 clientDataSize = 0 );
private:
queue_chain_t nextDevice;
SCSITargetLun targetLun;
SCSITarget *target;
IOSCSIParallelController *controller;
IOCommandGate *deviceGate;
IOService *client;
IORWLock * clientSem;
queue_head_t deviceList;
queue_head_t bypassList;
queue_head_t activeList;
queue_head_t abortList;
queue_head_t cancelList;
SCSICommandType abortCmdPending;
UInt32 reqSenseState;
UInt32 abortState;
UInt32 cancelState;
UInt32 negotiateState;
IOSCSIParallelCommand *reqSenseOrigCmd;
IOSCSIParallelCommand *reqSenseCmd;
IOSCSIParallelCommand *abortCmd;
IOSCSIParallelCommand *cancelCmd;
IOSCSIParallelCommand *probeCmd;
bool normalQHeld;
bool bypassQHeld;
bool idleNotifyActive;
CallbackFn idleNotifyCallback;
void *idleNotifyTarget;
void *idleNotifyRefcon;
UInt32 commandCount;
UInt32 commandLimit;
UInt32 commandLimitSave;
bool disableDisconnect;
UInt32 *tagArray;
SCSILunParms lunParmsNew;
SCSIInquiry *inquiryData;
UInt32 inquiryDataSize;
void *devicePrivateData;
};
#define kIOSCSIParallelDevice ((IOSCSIParallelDevice *)0)
#endif