| 441 | } |
| 442 | |
| 443 | int vnic_dev_cmd(struct vnic_dev *vdev, enum vnic_devcmd_cmd cmd, |
| 444 | uint64_t *a0, uint64_t *a1, int wait) |
| 445 | { |
| 446 | uint64_t args[2]; |
| 447 | bool vf_rep; |
| 448 | int vf_idx; |
| 449 | int err; |
| 450 | |
| 451 | vf_rep = false; |
| 452 | if (vdev->pf_vdev) { |
| 453 | vf_rep = true; |
| 454 | vf_idx = vdev->vf_id; |
| 455 | /* Everything below assumes PF vdev */ |
| 456 | vdev = vdev->pf_vdev; |
| 457 | } |
| 458 | if (vdev->lock) |
| 459 | vdev->lock(vdev->priv); |
| 460 | /* For VF representor, proxy devcmd to VF index */ |
| 461 | if (vf_rep) |
| 462 | vnic_dev_cmd_proxy_by_index_start(vdev, vf_idx); |
| 463 | |
| 464 | args[0] = *a0; |
| 465 | args[1] = *a1; |
| 466 | memset(vdev->args, 0, sizeof(vdev->args)); |
| 467 | |
| 468 | switch (vdev->proxy) { |
| 469 | case PROXY_BY_INDEX: |
| 470 | err = vnic_dev_cmd_proxy(vdev, CMD_PROXY_BY_INDEX, cmd, |
| 471 | args, ARRAY_SIZE(args), wait); |
| 472 | break; |
| 473 | case PROXY_BY_BDF: |
| 474 | err = vnic_dev_cmd_proxy(vdev, CMD_PROXY_BY_BDF, cmd, |
| 475 | args, ARRAY_SIZE(args), wait); |
| 476 | break; |
| 477 | case PROXY_NONE: |
| 478 | default: |
| 479 | err = vnic_dev_cmd_no_proxy(vdev, cmd, args, 2, wait); |
| 480 | break; |
| 481 | } |
| 482 | |
| 483 | if (vf_rep) |
| 484 | vnic_dev_cmd_proxy_end(vdev); |
| 485 | if (vdev->unlock) |
| 486 | vdev->unlock(vdev->priv); |
| 487 | if (err == 0) { |
| 488 | *a0 = args[0]; |
| 489 | *a1 = args[1]; |
| 490 | } |
| 491 | |
| 492 | return err; |
| 493 | } |
| 494 | |
| 495 | int vnic_dev_cmd_args(struct vnic_dev *vdev, enum vnic_devcmd_cmd cmd, |
| 496 | uint64_t *args, int nargs, int wait) |
no test coverage detected