int efa_device_init()

in efawin/efa_win_cmd.c [124:159]


int efa_device_init(void)
{
    struct ibv_device** device_list = NULL;
    int ctx_idx;
    int ret;

    device_list = ibv_get_device_list(&dev_cnt);

    ctx_list = calloc(dev_cnt, sizeof(*ctx_list));
    if (!ctx_list) {
        ret = -ENOMEM;
        goto err_free_dev_list;
    }

    for (ctx_idx = 0; ctx_idx < dev_cnt; ctx_idx++) {
        ctx_list[ctx_idx] = efa_device_open(device_list[ctx_idx]);
        if (!ctx_list[ctx_idx]) {
            ret = -ENODEV;
            goto err_close_devs;
        }
    }

    free(device_list);

    return 0;

err_close_devs:
    for (ctx_idx--; ctx_idx >= 0; ctx_idx--)
        efa_device_close(ctx_list[ctx_idx]);
    free(ctx_list);
    ctx_list = NULL;
err_free_dev_list:
    free(device_list);
    dev_cnt = 0;
    return ret;
}