编写适用于 Oracle® Solaris 11.2 的设备驱动程序

退出打印视图

更新时间: 2014 年 9 月
 
 

scsi_init_pkt() 函数

scsi_init_pkt(9F) 例程分配 scsi_pkt(9S) 结构并将该结构调整归零。scsi_init_pkt() 还设置指向 pkt_private*pkt_scbp*pkt_cdbp 的指针。此外,scsi_init_pkt() 还提供回调机制来处理资源不可用的情况。该函数的语法如下所示:

struct scsi_pkt *scsi_init_pkt(struct scsi_address *ap,
     struct scsi_pkt *pktp, struct buf *bp, int cmdlen,
     int statuslen, int privatelen, int flags,
     int (*callback)(caddr_t), caddr_t arg)

其中:

ap

指向 scsi_address 结构的指针。ap 是设备的 scsi_device(9S) 结构的 sd_address 字段。

pktp

指向要初始化的 scsi_pkt(9S) 结构的指针。如果将该指针设置为 NULL,则会分配一个新包。

bp

指向 buf(9S) 结构的指针。如果该指针为具有有效字节计数的非 null 值,则会分配 DMA 资源。

cmdlen

SCSI 命令描述符块的长度(字节)。

statuslen

SCSI 状态完成块的必需长度(字节)。

privatelen

要为 pkt_private 字段分配的字节数。

flags

标志集:

  • PKT_CONSISTENT-如果 DMA 缓冲区是使用 scsi_alloc_consistent_buf(9F) 分配的,则必须设置该位。在这种情况下,主机总线适配器驱动程序将保证在执行目标驱动程序的命令完成回调之前正确同步数据传输。

  • PKT_DMA_PARTIAL-如果驱动程序接受部分 DMA 映射,则可以设置该位。如果设置了该位,scsi_init_pkt(9F) 将分配 DMA 资源并设置 DDI_DMA_PARTIAL 标志。返回的 scsi_pkt(9S) 结构的 pkt_resid 字段值可以是非零的剩余值。非零值表示 scsi_init_pkt(9F) 无法分配的 DMA 资源字节数。

callback

指定资源不可用时要执行的操作。如果设置为 NULL_FUNCscsi_init_pkt(9F) 将立即返回值 NULL。如果设置为 SLEEP_FUNC,则在资源可用之前,scsi_init_pkt() 不会返回。当资源可能可用时,会将任何其他有效的内核地址解释为要调用的函数的地址。

arg

要传递给回调函数的参数。

传输之前,scsi_init_pkt() 例程将同步数据。如果驱动程序需要在传输后访问数据,则驱动程序应调用 scsi_sync_pkt(9F) 以刷新任何中间高速缓存。可以使用 scsi_sync_pkt() 例程来同步所有高速缓存的数据。