162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only
262306a36Sopenharmony_ci// Copyright 2013 Cisco Systems, Inc.  All rights reserved.
362306a36Sopenharmony_ci
462306a36Sopenharmony_ci#include <linux/netdevice.h>
562306a36Sopenharmony_ci#include <linux/spinlock.h>
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci#include "vnic_dev.h"
862306a36Sopenharmony_ci#include "vnic_devcmd.h"
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci#include "enic_res.h"
1162306a36Sopenharmony_ci#include "enic.h"
1262306a36Sopenharmony_ci#include "enic_api.h"
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ciint enic_api_devcmd_proxy_by_index(struct net_device *netdev, int vf,
1562306a36Sopenharmony_ci	enum vnic_devcmd_cmd cmd, u64 *a0, u64 *a1, int wait)
1662306a36Sopenharmony_ci{
1762306a36Sopenharmony_ci	int err;
1862306a36Sopenharmony_ci	struct enic *enic = netdev_priv(netdev);
1962306a36Sopenharmony_ci	struct vnic_dev *vdev = enic->vdev;
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_ci	spin_lock(&enic->enic_api_lock);
2262306a36Sopenharmony_ci	while (enic->enic_api_busy) {
2362306a36Sopenharmony_ci		spin_unlock(&enic->enic_api_lock);
2462306a36Sopenharmony_ci		cpu_relax();
2562306a36Sopenharmony_ci		spin_lock(&enic->enic_api_lock);
2662306a36Sopenharmony_ci	}
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_ci	spin_lock_bh(&enic->devcmd_lock);
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_ci	vnic_dev_cmd_proxy_by_index_start(vdev, vf);
3162306a36Sopenharmony_ci	err = vnic_dev_cmd(vdev, cmd, a0, a1, wait);
3262306a36Sopenharmony_ci	vnic_dev_cmd_proxy_end(vdev);
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ci	spin_unlock_bh(&enic->devcmd_lock);
3562306a36Sopenharmony_ci	spin_unlock(&enic->enic_api_lock);
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_ci	return err;
3862306a36Sopenharmony_ci}
3962306a36Sopenharmony_ciEXPORT_SYMBOL(enic_api_devcmd_proxy_by_index);
40