pciv_send(9F) 接口由具有 SR-IOV 功能的 PF 和 VF 驱动程序用来彼此进行通信。尽管 VF 驱动程序只能与其 PF 驱动程序进行通信,但 PF 驱动程序可与其任何 VF 驱动程序进行通信。
int pciv_send(dev_info_t *dip, pciv_pvp_req_t *req
其中:
指向 dev_info 结构的指针。
指向 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;
其中:
如果由 PF 驱动程序调用,则 VF 索引的范围是 1 到 num_vf。如果调用方是 VF 驱动程序,则它应当始终为 PCIV_PF。
要发送的调用方缓冲区的缓冲区地址。
要传送的字节数,必须小于 8k。
回调函数指针,如果 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);
其中:
用于传输的 DDI 返回代码。
要发送的调用方缓冲区的缓冲区地址。
要传输的字节数。
调用方在调用例程时设置的输入参数。
pvp_cb 的回调输入参数,如果 pvp_flag 设置为 PCIV_NOWAIT。
PCIV_NOWAIT-不等待接收方的响应。
PCIV_WAIT-这是缺省状态。等待,直到接收方确认接收传输。
pciv_send() 接口返回以下返回值之一:
缓冲区已成功发送。
设备驱动程序不支持此操作。调用方可以使用其他机制,如硬件邮箱。
pvp_nbyte 或 pvp_dstfunc 无效。
操作因缺少资源而失败。
远程端未注册用于处理传入的传输的回调。
因意外原因失败。