SCSIPathManagers.h [plain text]
#ifndef __IOKIT_SCSI_PATH_MANAGERS_H__
#define __IOKIT_SCSI_PATH_MANAGERS_H__
#include <libkern/c++/OSArray.h>
#include <IOKit/IOLocks.h>
#include "SCSITargetDevicePathManager.h"
#include <IOKit/scsi/SCSIPort.h>
class SCSIPathSet : public OSArray
{
OSDeclareDefaultStructors ( SCSIPathSet )
public:
static SCSIPathSet * withCapacity ( unsigned int capacity );
bool setObject ( const SCSITargetDevicePath * path );
bool member ( const SCSITargetDevicePath * path ) const;
bool member ( const IOSCSIProtocolServices * interface ) const;
void removeObject ( const IOSCSIProtocolServices * interface );
SCSITargetDevicePath * getAnyObject ( void ) const;
SCSITargetDevicePath * getObject ( unsigned int index ) const;
SCSITargetDevicePath * getObjectWithInterface ( const IOSCSIProtocolServices * interface ) const;
};
class SCSIPressurePathManager : public SCSITargetDevicePathManager
{
OSDeclareDefaultStructors ( SCSIPressurePathManager )
private:
IOLock * fLock;
SCSIPathSet * fPathSet;
SCSIPathSet * fInactivePathSet;
protected:
bool InitializePathManagerForTarget (
IOSCSITargetDevice * target,
IOSCSIProtocolServices * initialPath );
void free ( void );
public:
static SCSIPressurePathManager * Create (
IOSCSITargetDevice * target,
IOSCSIProtocolServices * initialPath );
void ExecuteCommand ( SCSITaskIdentifier request );
virtual SCSIServiceResponse AbortTask ( SCSILogicalUnitNumber theLogicalUnit, SCSITaggedTaskIdentifier theTag );
virtual SCSIServiceResponse AbortTaskSet ( SCSILogicalUnitNumber theLogicalUnit );
virtual SCSIServiceResponse ClearACA ( SCSILogicalUnitNumber theLogicalUnit );
virtual SCSIServiceResponse ClearTaskSet ( SCSILogicalUnitNumber theLogicalUnit );
virtual SCSIServiceResponse LogicalUnitReset ( SCSILogicalUnitNumber theLogicalUnit );
virtual SCSIServiceResponse TargetReset ( void );
virtual void TaskCompletion ( SCSITaskIdentifier request, SCSITargetDevicePath * path );
bool AddPath ( IOSCSIProtocolServices * path );
void ActivatePath ( IOSCSIProtocolServices * path );
void InactivatePath ( IOSCSIProtocolServices * path );
void RemovePath ( IOSCSIProtocolServices * path );
void PathStatusChanged ( IOSCSIProtocolServices * path, SCSIPortStatus newStatus );
class PortBandwidthGlobals
{
public:
static PortBandwidthGlobals * GetSharedInstance ( void );
PortBandwidthGlobals ( void );
virtual ~PortBandwidthGlobals ( void );
SCSITargetDevicePath * AllocateBandwidth ( SCSIPathSet * pathSet,
UInt64 bytes );
void DeallocateBandwidth ( SCSITargetDevicePath * path,
UInt64 bytes );
void AddSCSIPort ( UInt32 domainID );
private:
#if DEBUG_STATS
static void sDumpDebugInfo (
thread_call_param_t param0,
thread_call_param_t param1 );
void DumpDebugInfo ( void );
void SetTimer ( void );
#endif
UInt64 * fListHead;
IOLock * fLock;
UInt32 fPathsAllocated;
UInt32 fCapacity;
};
};
#endif