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