Writing Device Drivers

scsi_hba_tran Structure

Each instance of an HBA driver must allocate a scsi_hba_tran(9S) structure using scsi_hba_tran_alloc(9F) in the attach(9E) entry point. scsi_hba_tran_alloc(9F) initializes the scsi_hba_tran(9S) structure before it returns. The HBA driver must initialize specific vectors in the transport structure to point to entry points within the HBA driver. Once initialized, the HBA driver exports the transport structure to SCSA by calling scsi_hba_attach_setup(9F).


Caution - Caution -

Because SCSA keeps a pointer to the transport structure in the driver-private field on the devinfo node, HBA drivers must not use ddi_set_driver_private(9F). They can, however, use ddi_get_driver_private(9F) to retrieve the pointer to the transport structure.


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

struct scsi_hba_tran {
        dev_info_t      *tran_hba_dip;
        void            *tran_hba_private;      /* HBA softstate */
        void            *tran_tgt_private;      /* target-specific info */
        struct scsi_device      *tran_sd;
        int             (*tran_tgt_init)();
        int             (*tran_tgt_probe)();
        void            (*tran_tgt_free)();
        int             (*tran_start)();
        int             (*tran_reset)();
        int             (*tran_abort)();
        int             (*tran_getcap)();
        int             (*tran_setcap)();
        struct scsi_pkt *(*tran_init_pkt)();
        void            (*tran_destroy_pkt)();
        void            (*tran_dmafree)();
        void            (*tran_sync_pkt)();
        int             (*tran_reset_notify)();
        int             (*tran_get_bus_addr)();
        int             (*tran_get_name)();
        int             (*tran_clear_aca)();
        int             (*tran_clear_task_set)();
        int             (*tran_terminate_task)();
        int             (*tran_get_eventcookie)();
        int             (*tran_add_eventcall)();
        int             (*tran_remove_eventcall)();
        int             (*tran_post_event)();
        int             (*tran_quiesce)();
        int             (*tran_unquiesce)();
        int             (*tran_bus_reset)();
};

Note -

Code fragments presented subsequently in this chapter use these fields to describe practical HBA driver operations. See "SCSA HBA Entry Points" for more information.


tran_hba_dip

Pointer to the HBA device instance dev_info structure. The function scsi_hba_attach_setup(9F) sets this field.

tran_hba_private

Pointer to private data maintained by the HBA driver. Usually, tran_hba_private contains a pointer to the state structure of the HBA driver.

tran_tgt_private

Pointer to private data maintained by the HBA driver when using cloning. By specifying SCSI_HBA_TRAN_CLONE when calling scsi_hba_attach_setup(9F), the scsi_hba_tran(9S) structure is cloned once per target, permitting the HBA to initialize this field to point to a per-target instance data structure in the tran_tgt_init(9E) entry point. If SCSI_HBA_TRAN_CLONE is not specified, tran_tgt_private is NULL and must not be referenced. See "Transport Structure Cloning (Optional)" for more information.

tran_sd

Pointer to a per-target instance scsi_device(9S) structure used when cloning. If SCSI_HBA_TRAN_CLONE is passed to scsi_hba_attach_setup(9F), tran_sd is initialized to point to the per-target scsi_device structure before any HBA functions are called on behalf of that target. If SCSI_HBA_TRAN_CLONE is not specified, tran_sd is NULL and must not be referenced. See "Transport Structure Cloning (Optional)" for more information.

tran_tgt_init

Pointer to the HBA driver entry point called when initializing a target device instance. If no per-target initialization is required, the HBA can leave tran_tgt_init set to NULL.

tran_tgt_probe

Pointer to the HBA driver entry point called when a target driver instance calls scsi_probe(9F) to probe for the existence of a target device. If no target probing customization is required for this HBA, the HBA should set tran_tgt_probe to scsi_hba_probe(9F).

tran_tgt_free

Pointer to the HBA driver entry point called when a target device instance is destroyed. If no per-target deallocation is necessary, the HBA can leave tran_tgt_free set to NULL.

tran_start

Pointer to the HBA driver entry point called when a target driver calls scsi_transport(9F).

tran_reset

Pointer to the HBA driver entry point called when a target driver calls scsi_reset(9F).

tran_abort

Pointer to the HBA driver entry point called when a target driver calls scsi_abort(9F).

tran_getcap

Pointer to the HBA driver entry point called when a target driver calls scsi_ifgetcap(9F) .

tran_setcap

Pointer to the HBA driver entry point called when a target driver calls scsi_ifsetcap(9F).

tran_init_pkt

Pointer to the HBA driver entry point called when a target driver calls scsi_init_pkt(9F).

tran_destroy_pkt

Pointer to the HBA driver entry point called when a target driver calls scsi_destroy_pkt(9F).

tran_dmafree

Pointer to the HBA driver entry point called when a target driver calls scsi_dmafree(9F).

tran_sync_pkt

Pointer to the HBA driver entry point called when a target driver calls scsi_sync_pkt(9F).

tran_reset_notify

Pointer to the HBA driver entry point called when a target driver calls tran_reset_notify(9E).