Writing Device Drivers

scsi_device Structure

The HBA framework allocates and initializes a scsi_device(9S) structure for each instance of a target device before calling an HBA driver's tran_tgt_init(9E) entry point. This structure stores information about each SCSI logical unit, including pointers to information areas that contain both generic and device-specific information. There is one scsi_device(9S) structure for each target device instance attached to the system.

If the per-target initialization is successful (in other words, if either tran_tgt_init(9E) returns success or the vector is NULL), the HBA framework will set the target driver's per-instance private data to point to the scsi_device(9S) structure, using ddi_set_driver_private(9F).

The scsi_device(9S) structure contains the following fields:

struct scsi_device {
        struct scsi_address          sd_address;    /* routing information */
        dev_info_t                   *sd_dev;       /* device dev_info node */
        kmutex_t                     sd_mutex;      /* mutex used by device */
        void                         *sd_reserved;
        struct scsi_inquiry          *sd_inq;
        struct scsi_extended_sense   *sd_sense;
        caddr_t                      sd_private;    /* for driver's use */
};
sd_address

Data structure that is passed to the SCSI resource allocation routines.

sd_dev

Pointer to the target's dev_info structure.

sd_mutex

Mutex for use by the target driver. This is initialized by the HBA framework and can be used by the target driver as a per-device mutex. This mutex should not be held across a call to scsi_transport(9F) or scsi_poll(9F). See Chapter 3, Multithreading for more information on mutexes.

sd_inq

Pointer for the target device's SCSI inquiry data. The scsi_probe(9F) routine allocates a buffer, fills it in, and attaches it to this field.

sd_sense

Pointer to a buffer to contain Request Sense data from the device. The target driver must allocate and manage this buffer itself; see the target driver's attach(9E) routine in "attach(9E)" for more information.

sd_private

Pointer field for use by the target driver. It is commonly used to store a pointer to a private target driver state structure.