1 | // SPDX-License-Identifier: GPL-2.0-only |
2 | // Copyright 2013 Cisco Systems, Inc. All rights reserved. |
3 | |
4 | #include <linux/netdevice.h> |
5 | #include <linux/spinlock.h> |
6 | |
7 | #include "vnic_dev.h" |
8 | #include "vnic_devcmd.h" |
9 | |
10 | #include "enic_res.h" |
11 | #include "enic.h" |
12 | #include "enic_api.h" |
13 | |
14 | int enic_api_devcmd_proxy_by_index(struct net_device *netdev, int vf, |
15 | enum vnic_devcmd_cmd cmd, u64 *a0, u64 *a1, int wait) |
16 | { |
17 | int err; |
18 | struct enic *enic = netdev_priv(dev: netdev); |
19 | struct vnic_dev *vdev = enic->vdev; |
20 | |
21 | spin_lock(lock: &enic->enic_api_lock); |
22 | while (enic->enic_api_busy) { |
23 | spin_unlock(lock: &enic->enic_api_lock); |
24 | cpu_relax(); |
25 | spin_lock(lock: &enic->enic_api_lock); |
26 | } |
27 | |
28 | spin_lock_bh(lock: &enic->devcmd_lock); |
29 | |
30 | vnic_dev_cmd_proxy_by_index_start(vdev, index: vf); |
31 | err = vnic_dev_cmd(vdev, cmd, a0, a1, wait); |
32 | vnic_dev_cmd_proxy_end(vdev); |
33 | |
34 | spin_unlock_bh(lock: &enic->devcmd_lock); |
35 | spin_unlock(lock: &enic->enic_api_lock); |
36 | |
37 | return err; |
38 | } |
39 | EXPORT_SYMBOL(enic_api_devcmd_proxy_by_index); |
40 | |