in efawin/efa_win_cmd.c [194:238]
static int efa_everbs_cmd_get_ex_query_dev(struct efa_context* ctx,
struct ibv_device_attr* attr)
{
char* fw_ver;
struct efa_dev* edev = to_efa_dev(ctx->ibvctx.context.device);
attr->max_ah = edev->dev_attr.MaxAh;
ZeroMemory(attr, sizeof(struct ibv_device_attr));
// We query device attributes once in efa_device_open,
// and cache them in the efa_device struct.
// This function merely reads the cached values.
fw_ver = (char*)&edev->dev_attr.FirmwareVersion;
snprintf(attr->fw_ver, sizeof(edev->dev_attr.FirmwareVersion), "%u.%u.%u.%u",
fw_ver[0], fw_ver[1], fw_ver[2], fw_ver[3]);
fw_ver[sizeof(edev->dev_attr.FirmwareVersion)] = '\0';
attr->hw_ver = edev->dev_attr.DeviceVersion;
attr->vendor_part_id = 0xefa0;
attr->vendor_id = 0x1d0f;
attr->max_mr_size = edev->dev_attr.MaxMrPages * PAGE_SIZE;
attr->page_size_cap = edev->dev_attr.PageSizeCap;
attr->max_qp = edev->dev_attr.MaxQp;
attr->max_cq = edev->dev_attr.MaxCq;
attr->max_pd = edev->dev_attr.MaxPd;
attr->max_mr = edev->dev_attr.MaxMr;
attr->max_ah = edev->dev_attr.MaxAh;
attr->max_cqe = edev->dev_attr.MaxCqDepth;
attr->max_qp_wr = min(edev->dev_attr.MaxSqDepth,
edev->dev_attr.MaxRqDepth);
attr->max_sge = min(edev->dev_attr.MaxSqSge,
edev->dev_attr.MaxRqSge);
attr->page_size_cap = edev->dev_attr.PageSizeCap;
ctx->inline_buf_size = edev->dev_attr.InlineBufSize;
ctx->device_caps = edev->dev_attr.SupportedFeatures;
ctx->max_llq_size = edev->dev_attr.MaxLlqSize;
ctx->sub_cqs_per_cq = edev->dev_attr.NumSubCqs;
ctx->max_mr_size = edev->dev_attr.MaxMr;
ctx->max_rq_sge = edev->dev_attr.MaxRqSge;
ctx->max_sq_sge = edev->dev_attr.MaxSqSge;
ctx->max_rq_wr = edev->dev_attr.MaxRqDepth;
ctx->max_sq_wr = edev->dev_attr.MaxSqDepth;
ctx->max_tx_batch = 1; // max_tx_batch retrieval is not supported on current Windows Driver.
return 0;
}