<!--
{
  "availability" : [
    "DriverKit: -"
  ],
  "documentType" : "symbol",
  "framework" : "SCSIControllerDriverKit",
  "identifier" : "/documentation/SCSIControllerDriverKit/IOUserSCSIParallelInterfaceController",
  "metadataVersion" : "0.1.0",
  "role" : "Class",
  "symbol" : {
    "kind" : "Class",
    "modules" : [
      "SCSIControllerDriverKit"
    ],
    "preciseIdentifier" : "c:@S@IOUserSCSIParallelInterfaceController"
  },
  "title" : "IOUserSCSIParallelInterfaceController"
}
-->

# IOUserSCSIParallelInterfaceController

A DriverKit provider object that manages communications with SCSI-based devices.

```
class IOUserSCSIParallelInterfaceController;
```

## Overview

Implement your driver by subclassing this class and overriding all pure virtual methods.

The DriverKit framework starts the `Default` dispatch queue.
The system expects your dext to create two additional dispatch queues, named `AuxiliaryQueue` and `InterruptQueue`.
The [`UserCreateTargetForID`](/documentation/SCSIControllerDriverKit/IOUserSCSIParallelInterfaceController/UserCreateTargetForID) method uses the `AuxiliaryQueue` to avoid deadlock during start and initialization.

The framework invokes the dext class’s <doc://com.apple.documentation/documentation/DriverKit/IOService/Start> and other methods to initialize the SCSI controller.
Because these calls occur during DriverKit’s matching, it’s important to complete them quickly, to prevent keeping `IORegsitry` in a busy state for a long time.
In some cases, probing the media may take a long time and delay the initialization, especially when working with HDDs.
Defer these tasks if they take a long time to complete.

The framework provides the [`UserReportHBAConstraints`](/documentation/SCSIControllerDriverKit/IOUserSCSIParallelInterfaceController/UserReportHBAConstraints) API to report controller I/O constraints.
Make sure your dext reports these constraints accurately — particularly all mandatory keys — during initialization.
This helps prevent intermittent failures, such as controller firmware buffer overflows.

## Support power capabilities

IOUserSCSIParallelInterfaceController supports the following power capabilities:

- <doc://com.apple.documentation/documentation/DriverKit/kIOServicePowerCapabilityOff>
- <doc://com.apple.documentation/documentation/DriverKit/kIOServicePowerCapabilityOn>
- [`kIOServicePowerCapabilityPause`](/documentation/SCSIControllerDriverKit/kIOServicePowerCapabilityPause)

Implement the <doc://com.apple.documentation/documentation/DriverKit/IOService/SetPowerState> method in your service object and use it to put your driver in a safe state for the new power setting. Call `super` either as the last step in your implementation, or when the dext is ready to acknowledge the power state transition.

The following code example implements <doc://com.apple.documentation/documentation/DriverKit/IOService/SetPowerState> by performing a check to see if the new state is <doc://com.apple.documentation/documentation/DriverKit/kIOServicePowerCapabilityOn>. If it is, the implementation calls a private `IssueHardReset()` method.

```objc
kern_return_t
IMPL ( ExampleSCSIDext, SetPowerState )
{
    
    kern_return_t ret = kIOReturnError;

    …

    if ( powerState == kIOServicePowerCapabilityOn )
    {
        ret = IssueHardReset ( );
 
        ivars->fCurrentPowerState = kIOServicePowerCapabilityOn;
    }

    return ret;

}
```

The hypothetical driver in this example still needs to acknowledge the power state change when it’s appropriate. For example, it can ensure a rescan brought up all its targets, and then call `SetPowerState ( powerState, SUPERDISPATCH );`.

## Topics

### Managing controllers

[`virtual kern_return_t UserInitializeController();`](/documentation/SCSIControllerDriverKit/IOUserSCSIParallelInterfaceController/UserInitializeController)

Initializes the controller in response to a call from the framework.

[`virtual kern_return_t UserStartController();`](/documentation/SCSIControllerDriverKit/IOUserSCSIParallelInterfaceController/UserStartController)

Starts the controller in response to a call from the framework.

### Managing tasks

[`virtual kern_return_t UserProcessParallelTask(SCSIUserParallelTask parallelRequest, uint32_t *response, OSAction *completion);`](/documentation/SCSIControllerDriverKit/IOUserSCSIParallelInterfaceController/UserProcessParallelTask)

Processes a parallel task in response to a call from the framework.

[`typedef struct SCSIUserParallelTask { ... } SCSIUserParallelTask;`](/documentation/SCSIControllerDriverKit/SCSIUserParallelTask)

The properties of a parallel task to perform.

[`virtual void ParallelTaskCompletion(OSAction *action, SCSIUserParallelResponse response);`](/documentation/SCSIControllerDriverKit/IOUserSCSIParallelInterfaceController/ParallelTaskCompletion)

Indicates to the system that the extension has completed an asynchronous request.

[`typedef struct SCSIUserParallelResponse { ... } SCSIUserParallelResponse;`](/documentation/SCSIControllerDriverKit/SCSIUserParallelResponse)

The properties of a completed request.

### Managing bundled parallel tasks

[`virtual void UserProcessBundledParallelTasks(const uint16_t parallelRequestSlotIndices[32], uint16_t parallelRequestSlotIndicesCount, OSAction *completion);`](/documentation/SCSIControllerDriverKit/IOUserSCSIParallelInterfaceController/UserProcessBundledParallelTasks)

Processes one or more parallel tasks in response to a call from the framework.

[`virtual kern_return_t UserMapBundledParallelTaskCommandAndResponseBuffers(IOBufferMemoryDescriptor *parallelCommandIOMemoryDescriptor, IOBufferMemoryDescriptor *parallelResponseIOMemoryDescriptor);`](/documentation/SCSIControllerDriverKit/IOUserSCSIParallelInterfaceController/UserMapBundledParallelTaskCommandAndResponseBuffers)

Maps the shared command and response buffers in the dext address space in response to a call from the framework.

[`virtual void BundledParallelTaskCompletion(OSAction *action, const uint16_t parallelResponseSlotIndices[32], uint16_t parallelResponseSlotIndicesCount);`](/documentation/SCSIControllerDriverKit/IOUserSCSIParallelInterfaceController/BundledParallelTaskCompletion)

Indicates to the system that the extension completed a bundled asynchronous request.

[`#define kMaxBundledParallelTasks`](/documentation/SCSIControllerDriverKit/kMaxBundledParallelTasks)

### Managing targets

[`virtual kern_return_t UserInitializeTargetForID(SCSITargetIdentifier targetID);`](/documentation/SCSIControllerDriverKit/IOUserSCSIParallelInterfaceController/UserInitializeTargetForID)

Initializes a target device in response to a call from the framework.

[`virtual kern_return_t UserCreateTargetForID(SCSIDeviceIdentifier targetID, OSDictionary *targetDict);`](/documentation/SCSIControllerDriverKit/IOUserSCSIParallelInterfaceController/UserCreateTargetForID)

Creates the specified target.

[`virtual kern_return_t UserDestroyTargetForID(SCSITargetIdentifier targetID);`](/documentation/SCSIControllerDriverKit/IOUserSCSIParallelInterfaceController/UserDestroyTargetForID)

Destroys the specified target.

[`virtual kern_return_t UserTargetPresentForID(SCSIDeviceIdentifier targetID, bool *result);`](/documentation/SCSIControllerDriverKit/IOUserSCSIParallelInterfaceController/UserTargetPresentForID)

Checks if a specific target is present.

[`virtual kern_return_t UserSetTargetProperties(SCSIDeviceIdentifier targetID, OSDictionary *properties);`](/documentation/SCSIControllerDriverKit/IOUserSCSIParallelInterfaceController/UserSetTargetProperties)

Sets properties on the target.

[`virtual kern_return_t UserRemoveTargetProperties(SCSIDeviceIdentifier targetID, OSArray *properties);`](/documentation/SCSIControllerDriverKit/IOUserSCSIParallelInterfaceController/UserRemoveTargetProperties)

Removes properties from a target.

### Performing SCSI standard task management

[`virtual kern_return_t UserAbortTaskRequest(uint64_t theT, uint64_t theL, uint64_t theQ, uint32_t *response);`](/documentation/SCSIControllerDriverKit/IOUserSCSIParallelInterfaceController/UserAbortTaskRequest)

Aborts a single task.

[`virtual kern_return_t UserAbortTaskSetRequest(uint64_t theT, uint64_t theL, uint32_t *response);`](/documentation/SCSIControllerDriverKit/IOUserSCSIParallelInterfaceController/UserAbortTaskSetRequest)

Aborts all tasks in a logical unit.

[`virtual kern_return_t UserClearACARequest(uint64_t theT, uint64_t theL, uint32_t *response);`](/documentation/SCSIControllerDriverKit/IOUserSCSIParallelInterfaceController/UserClearACARequest)

Removes an autocontingent allegiance (ACA) attribute from a logical unit’s task set.

[`virtual kern_return_t UserClearTaskSetRequest(uint64_t theT, uint64_t theL, uint32_t *response);`](/documentation/SCSIControllerDriverKit/IOUserSCSIParallelInterfaceController/UserClearTaskSetRequest)

Aborts all tasks in a logical unit and clears their data.

[`virtual kern_return_t UserLogicalUnitResetRequest(uint64_t theT, uint64_t theL, uint32_t *response);`](/documentation/SCSIControllerDriverKit/IOUserSCSIParallelInterfaceController/UserLogicalUnitResetRequest)

Resets a logical unit.

[`virtual kern_return_t UserTargetResetRequest(uint64_t theT, uint32_t *response);`](/documentation/SCSIControllerDriverKit/IOUserSCSIParallelInterfaceController/UserTargetResetRequest)

Resets a target.

### Managing host bus adapters

[`virtual kern_return_t UserReportInitiatorIdentifier(uint64_t *id);`](/documentation/SCSIControllerDriverKit/IOUserSCSIParallelInterfaceController/UserReportInitiatorIdentifier)

Gets the SCSI device identifier for the host bus adapter (HBA) in response to a call from the framework.

[`virtual kern_return_t UserReportHighestSupportedDeviceID(uint64_t *id);`](/documentation/SCSIControllerDriverKit/IOUserSCSIParallelInterfaceController/UserReportHighestSupportedDeviceID)

Gets the highest supported SCSI device identifier in response to a call from the framework.

[`virtual kern_return_t UserReportMaximumTaskCount(uint32_t *count);`](/documentation/SCSIControllerDriverKit/IOUserSCSIParallelInterfaceController/UserReportMaximumTaskCount)

Gets the maximum number of outstanding tasks the HBA can process in response to a call from the framework.

[`virtual kern_return_t UserDoesHBAPerformDeviceManagement(bool *result);`](/documentation/SCSIControllerDriverKit/IOUserSCSIParallelInterfaceController/UserDoesHBAPerformDeviceManagement)

Determines if the host bus adapter (HBA) manages devices in response to a call from the framework.

[`virtual kern_return_t UserReportHBAHighestLogicalUnitNumber(uint64_t *value);`](/documentation/SCSIControllerDriverKit/IOUserSCSIParallelInterfaceController/UserReportHBAHighestLogicalUnitNumber)

Gets the highest logical unit number (LUN) in response to a call from the framework.

[`virtual kern_return_t UserDoesHBAPerformAutoSense(bool *result);`](/documentation/SCSIControllerDriverKit/IOUserSCSIParallelInterfaceController/UserDoesHBAPerformAutoSense)

Determines if the driver extension class automatically performs autosense and provides autosense data for each I/O in response to a call from the framework.

[`virtual kern_return_t UserDoesHBASupportMultiPathing(bool *result);`](/documentation/SCSIControllerDriverKit/IOUserSCSIParallelInterfaceController/UserDoesHBASupportMultiPathing)

Queries the HBA child class to determine if it supports multipathing in response to a call from the framework.

[`virtual kern_return_t UserDoesHBASupportSCSIParallelFeature(uint32_t theValue, bool *result);`](/documentation/SCSIControllerDriverKit/IOUserSCSIParallelInterfaceController/UserDoesHBASupportSCSIParallelFeature)

Determines whether the driver extension class supports a specific feature in response to a call from the framework.

[`typedef enum SCSIParallelFeature : unsigned int { ... } SCSIParallelFeature;`](/documentation/SCSIControllerDriverKit/SCSIParallelFeature)

A feature that the driver extension supports.

[`virtual kern_return_t UserMapHBAData(uint32_t *uniqueTaskID);`](/documentation/SCSIControllerDriverKit/IOUserSCSIParallelInterfaceController/UserMapHBAData)

Maps any host bus adapter (HBA)-specific task data in response to a call from the framework.

[`virtual kern_return_t UserSetHBAProperties(OSDictionary *properties);`](/documentation/SCSIControllerDriverKit/IOUserSCSIParallelInterfaceController/UserSetHBAProperties)

Sets multiple properties for a host bus adapter.

[`virtual kern_return_t UserRemoveHBAProperties(OSArray *properties);`](/documentation/SCSIControllerDriverKit/IOUserSCSIParallelInterfaceController/UserRemoveHBAProperties)

Removes properties from a host bus adapter in response to a call from the framework.

[`virtual kern_return_t UserReportHBAConstraints(OSDictionary *constraints);`](/documentation/SCSIControllerDriverKit/IOUserSCSIParallelInterfaceController/UserReportHBAConstraints)

Reports the I/O constraints for this controller.

### Managing direct memory access

[`virtual kern_return_t UserGetDMASpecification(uint64_t *maxTransferSize, uint32_t *alignment, uint8_t *numAddressBits, DMAOutputSegmentType *segmentType);`](/documentation/SCSIControllerDriverKit/IOUserSCSIParallelInterfaceController/UserGetDMASpecification)

Gets the controller-specific direct memory access (DMA) specification in response to a call from the framework.

[`typedef enum DMAOutputSegmentType : uint16_t { ... } DMAOutputSegmentType;`](/documentation/SCSIControllerDriverKit/DMAOutputSegmentType)

The size and endianness that the system uses for direct memory access (DMA).

### Supporting SCSI power states

[`#define kIOServicePowerCapabilityPause`](/documentation/SCSIControllerDriverKit/kIOServicePowerCapabilityPause)

A PCIe-specific power state for halting transactions while reallocating resources.

### Handling media changes

[`virtual kern_return_t UserCallMediaParametersHaveChanged();`](/documentation/SCSIControllerDriverKit/IOUserSCSIParallelInterfaceController/UserCallMediaParametersHaveChanged)

Indicates to the system that the media parameters changed.

### Accessing data buffers

[`virtual kern_return_t UserCopyDataBuffer(SCSIDeviceIdentifier targetID, uint64_t controllerTaskID, IOBufferMemoryDescriptor **buffer);`](/documentation/SCSIControllerDriverKit/IOUserSCSIParallelInterfaceController/UserCopyDataBuffer)

Gets the data buffer associated with a particular I/O request.

[`virtual kern_return_t UserGetDataBuffer(SCSIDeviceIdentifier targetID, uint64_t controllerTaskID, IOBufferMemoryDescriptor **buffer);`](/documentation/SCSIControllerDriverKit/IOUserSCSIParallelInterfaceController/UserGetDataBuffer)

Gets the data buffer associated with a particular I/O request.

## Relationships

### Inherits From

[`IOService`](/documentation/DriverKit/IOService)

---

Copyright &copy; 2026 Apple Inc. All rights reserved. | [Terms of Use](https://www.apple.com/legal/internet-services/terms/site.html) | [Privacy Policy](https://www.apple.com/privacy/privacy-policy)