要执行 SCSI 命令,目标驱动程序必须首先为该命令分配 scsi_pkt(9S) 结构。然后,目标驱动程序必须指定其自身的专用数据区长度、命令状态和命令长度。HBA 驱动程序负责实现 tran_init_pkt(9E) 入口点中的包分配。另外,HBA 驱动程序还负责释放其 tran_destroy_pkt(9E) 入口点中的包。有关更多信息,请参见scsi_pkt 结构(目标驱动程序)。
scsi_pkt(9S) 结构包含以下字段:
struct scsi_pkt { opaque_t pkt_ha_private; /* private data for host adapter */ struct scsi_address pkt_address; /* destination address */ opaque_t pkt_private; /* private data for target driver */ void (*pkt_comp)(struct scsi_pkt *); /* completion routine */ uint_t pkt_flags; /* flags */ int pkt_time; /* time allotted to complete command */ uchar_t *pkt_scbp; /* pointer to status block */ uchar_t *pkt_cdbp; /* pointer to command block */ ssize_t pkt_resid; /* data bytes not transferred */ uint_t pkt_state; /* state of command */ uint_t pkt_statistics; /* statistics */ uchar_t pkt_reason; /* reason completion called */ };
其中:
指向按命令的 HBA 驱动程序专用数据的指针。
指向用于为此命令提供地址信息的 scsi_address(9S) 结构的指针。
指向按包的目标驱动程序专用数据的指针。
指向在传输层完成此命令时 HBA 驱动程序调用的目标驱动程序完成例程的指针。
命令的标志。
指定命令的完成超时时间(以秒为单位)。
指向命令的状态完成块的指针。
指向命令的命令描述符块 (command descriptor block, CDB) 的指针。
命令完成时未传送的数据字节计数。此字段也可能会用于指定尚未分配资源的数据量。在传输过程中,HBA 必须修改此字段。
命令的状态。在传输过程中,HBA 必须修改此字段。
提供命令在传输层中发生的事件的历史记录。在传输过程中,HBA 必须修改此字段。
命令完成的原因。在传输过程中,HBA 必须修改此字段。