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

退出打印视图

更新时间: 2014 年 9 月
 
 

pciv_send() 接口

pciv_send(9F) 接口由具有 SR-IOV 功能的 PF 和 VF 驱动程序用来彼此进行通信。尽管 VF 驱动程序只能与其 PF 驱动程序进行通信,但 PF 驱动程序可与其任何 VF 驱动程序进行通信。

int pciv_send(dev_info_t *dip, pciv_pvp_req_t *req

其中:

dip

指向 dev_info 结构的指针。

req

指向 pciv_pvp_req_t 结构的指针。

pciv_pvp_req_t 的结构为:

typedef struct pciv_pvp_req {
int pvp_dstfunc;
caddr_t pvp_buf;
size_t pvp_nbyte;
buf_cb_t pvp_cb;
caddr_t pvp_cb_arg;
uint_t pvp_flag;
} pciv_pvp_req_t;

其中:

pvp_dstfunc

如果由 PF 驱动程序调用,则 VF 索引的范围是 1 到 num_vf。如果调用方是 VF 驱动程序,则它应当始终为 PCIV_PF。

pvp_buf

要发送的调用方缓冲区的缓冲区地址。

pvp_nbyte

要传送的字节数,必须小于 8k。

pvp_cb

回调函数指针,如果 pvp_flag 设置为 PCIV_NOWAIT

如果 pvp_flag 设置为 PCIV_NOWAIT,调用将立即返回,并在将 pvp_buf 中的数据传送到目标之前调用 pvp_cb 中的回调例程。随后,将允许调用方在其回调例程中释放缓冲区。

typedef void (*buf_cb_t)(int rc, caddr_t buf, size_t size, caddr_t cb_arg);

其中:

rc

用于传输的 DDI 返回代码。

buf

要发送的调用方缓冲区的缓冲区地址。

size

要传输的字节数。

cb_arg

调用方在调用例程时设置的输入参数。

pvp_cb_arg

pvp_cb 的回调输入参数,如果 pvp_flag 设置为 PCIV_NOWAIT

pvp_flag
  • PCIV_NOWAIT-不等待接收方的响应。

  • PCIV_WAIT-这是缺省状态。等待,直到接收方确认接收传输。

pciv_send() 接口返回以下返回值之一:

DDI_SUCCESS

缓冲区已成功发送。

DDI_ENOTSUP

设备驱动程序不支持此操作。调用方可以使用其他机制,如硬件邮箱。

DDI_EINVAL

pvp_nbytepvp_dstfunc 无效。

DDI_ENOMEM

操作因缺少资源而失败。

DDI_ETRANSPORT

远程端未注册用于处理传入的传输的回调。

DDI_FAILURE

因意外原因失败。