Skip Navigation Links | |
Exit Print View | |
Writing Device Drivers Oracle Solaris 11.1 Information Library |
Part I Designing Device Drivers for the Oracle Solaris Platform
1. Overview of Oracle Solaris Device Drivers
2. Oracle Solaris Kernel and Device Tree
5. Managing Events and Queueing Tasks
7. Device Access: Programmed I/O
10. Mapping Device and Kernel Memory
13. Hardening Oracle Solaris Drivers
14. Layered Driver Interface (LDI)
Part II Designing Specific Kinds of Device Drivers
15. Drivers for Character Devices
18. SCSI Host Bus Adapter Drivers
Introduction to Host Bus Adapter Drivers
HBA Driver Dependency and Configuration Issues
Entry Points for Module Initialization
_init() Entry Point (SCSI HBA Drivers)
_fini() Entry Point (SCSI HBA Drivers)
Autoconfiguration Entry Points
attach() Entry Point (SCSI HBA Drivers)
detach() Entry Point (SCSI HBA Drivers)
Entry Points for SCSA HBA Drivers
Target Driver Instance Initialization
Allocation and Initialization of a scsi_pkt(9S) Structure
Reallocation of DMA Resources for Data Transfer
tran_destroy_pkt() Entry Point
Interrupt Handler and Command Completion
tran_reset_notify() Entry Point
19. Drivers for Network Devices
Part III Building a Device Driver
22. Compiling, Loading, Packaging, and Testing Drivers
23. Debugging, Testing, and Tuning Device Drivers
24. Recommended Coding Practices
B. Summary of Oracle Solaris DDI/DKI Services
C. Making a Device Driver 64-Bit Ready
The section covers issues specific to SCSI HBA drivers.
A SCSI HBA driver is installed in similar fashion to a leaf driver. See Chapter 22, Compiling, Loading, Packaging, and Testing Drivers. The difference is that the add_drv(1M) command must specify the driver class as SCSI, such as:
# add_drv -m" * 0666 root root" -i'"pci1077,1020"' -c scsi isp
When attaching an instance of an HBA device, scsi_hba_attach_setup(9F) creates a number of SCSI configuration properties for that HBA instance. A particular property is created only if no existing property of the same name is already attached to the HBA instance. This restriction avoids overriding any default property values in an HBA configuration file.
An HBA driver must use ddi_prop_get_int(9F) to retrieve each property. The HBA driver then modifies or accepts the default value of the properties to configure its specific operation.
The scsi-reset-delay property is an integer specifying the recovery time in milliseconds for a reset delay by either a SCSI bus or SCSI device.
The scsi-options property is an integer specifying a number of options through individually defined bits:
SCSI_OPTIONS_DR (0x008) – If not set, the HBA should not grant disconnect privileges to a target device.
SCSI_OPTIONS_LINK (0x010) – If not set, the HBA should not enable linked commands.
SCSI_OPTIONS_SYNC (0x020) – If not set, the HBA driver must not negotiate synchronous data transfer. The driver should reject any attempt to negotiate synchronous data transfer initiated by a target.
SCSI_OPTIONS_PARITY (0x040) – If not set, the HBA should run the SCSI bus without parity.
SCSI_OPTIONS_TAG (0x080) – If not set, the HBA should not operate in Command Tagged Queuing mode.
SCSI_OPTIONS_FAST (0x100) – If not set, the HBA should not operate the bus in FAST SCSI mode.
SCSI_OPTIONS_WIDE (0x200) – If not set, the HBA should not operate the bus in WIDE SCSI mode.
An HBA driver might support a per-target scsi-options feature in the following format:
target<n>-scsi-options=<hex value>
In this example, < n> is the target ID. If the per-target scsi-options property is defined, the HBA driver uses that value rather than the per-HBA driver instance scsi-options property. This approach can provide more precise control if, for example, synchronous data transfer needs to be disabled for just one particular target device. The per-target scsi-options property can be defined in the driver.conf(4) file.
The following example shows a per-target scsi-options property definition to disable synchronous data transfer for target device 3:
target3-scsi-options=0x2d8
Some x86 SCSI target drivers, such as the driver for cmdk disk, use the following configuration properties:
disk
queue
flow_control
If you use the cmdk sample driver to write an HBA driver for an x86 platform, any appropriate properties must be defined in the driver.conf(4) file.
Note - These property definitions should appear only in an HBA driver's driver.conf(4) file. The HBA driver itself should not inspect or attempt to interpret these properties in any way. These properties are advisory only and serve as an adjunct to the cmdk driver. The properties should not be relied upon in any way. The property definitions might not be used in future releases.
The disk property can be used to define the type of disk supported by cmdk. For a SCSI HBA, the only possible value for the disk property is:
disk="scdk" – Disk type is a SCSI disk
The queue property defines how the disk driver sorts the queue of incoming requests during strategy(9E). Two values are possible:
queue="qsort" – One-way elevator queuing model, provided by disksort(9F)
queue="qfifo" – FIFO, that is, first in, first out queuing model
The flow_control property defines how commands are transported to the HBA driver. Three values are possible:
flow_control="dsngl" – Single command per HBA driver
flow_control="dmult" – Multiple commands per HBA driver. When the HBA queue is full, the driver returns TRAN_BUSY.
flow_control="duplx" – The HBA can support separate read and write queues, with multiple commands per queue. FIFO ordering is used for the write queue. The queuing model that is used for the read queue is described by the queue property. When an HBA queue is full, the driver returns TRAN_BUSY
The following example is a driver.conf(4) file for use with an x86 HBA PCI device that has been designed for use with the cmdk sample driver:
# # config file for ISP 1020 SCSI HBA driver # flow_control="dsngl" queue="qsort" disk="scdk" scsi-initiator-id=7;