enic_api.c 940 B

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