// Copyright (c) 2019 The Fuchsia Authors
//
// Permission to use, copy, modify, and/or distribute this software for any purpose with or without
// fee is hereby granted, provided that the above copyright notice and this permission notice
// appear in all copies.
//
// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
// SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
// AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
// NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
// OF THIS SOFTWARE.

#ifndef SRC_CONNECTIVITY_WLAN_DRIVERS_THIRD_PARTY_BROADCOM_BRCMFMAC_DEVICE_H_
#define SRC_CONNECTIVITY_WLAN_DRIVERS_THIRD_PARTY_BROADCOM_BRCMFMAC_DEVICE_H_

#include <lib/async-loop/cpp/loop.h>
#include <zircon/types.h>

#include <memory>

#include <ddk/device.h>
#include <ddktl/device.h>
#include <ddktl/protocol/wlanphyimpl.h>

#include "src/connectivity/wlan/drivers/third_party/broadcom/brcmfmac/bus.h"
#include "src/connectivity/wlan/drivers/third_party/broadcom/brcmfmac/core.h"

namespace wlan {
namespace brcmfmac {

// This class uses the DDKTL classes to manage the lifetime of a brcmfmac driver instance.
class Device : public ::ddk::Device<Device, ::ddk::Unbindable>,
               public ::ddk::WlanphyImplProtocol<Device, ::ddk::base_protocol> {
 public:
  // Static factory function for Device instances. This factory does not return an owned instance,
  // as on successful invocation the instance will have its lifecycle maanged by the devhost.
  static zx_status_t Create(zx_device_t* parent_device, Device** device_out);
  explicit Device(std::unique_ptr<::async::Loop> dispatcher, std::unique_ptr<brcmf_pub> brcmf_pub,
                  std::unique_ptr<brcmf_bus> brcmf_bus);

  Device(const Device& device) = delete;
  Device& operator=(const Device& other) = delete;

  // For testing: unbind this instance explicitly, when no devhost is available. After this call,
  // the instance is deleted.
  void SimUnbind();

  // DDK interface implementation.
  void DdkUnbind();
  void DdkRelease();

  // WlanphyImpl protocol implementation.
  zx_status_t WlanphyImplQuery(wlanphy_impl_info_t* out_info);
  zx_status_t WlanphyImplCreateIface(const wlanphy_impl_create_iface_req_t* req,
                                     uint16_t* out_iface_id);
  zx_status_t WlanphyImplDestroyIface(uint16_t iface_id);
  zx_status_t WlanphyImplSetCountry(const wlanphy_country_t* country);

 protected:
  explicit Device(zx_device_t* parent);
  ~Device();

 private:
  std::unique_ptr<::async::Loop> dispatcher_;
  std::unique_ptr<brcmf_pub> brcmf_pub_;
  std::unique_ptr<brcmf_bus> brcmf_bus_;
};

}  // namespace brcmfmac
}  // namespace wlan

#endif  // SRC_CONNECTIVITY_WLAN_DRIVERS_THIRD_PARTY_BROADCOM_BRCMFMAC_DEVICE_H_
