# Copyright 2021 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import("//build/bind/bind.gni")

visibility = [ "//src/iwlwifi/*" ]

# This BUILD.gn defines the Fuchsia-specific platform support library for the iwlwifi driver.

# Platform-support library for the iwlwifi driver.
source_set("platform") {
  sources = [
    "debug.cc",
    "device.cc",
    "ieee80211.cc",
    "irq.cc",
    "memory.cc",
    "module.cc",
    "task-internal.cc",
    "task.cc",
    "time.cc",
  ]
  public = [
    "compiler.h",
    "debug.h",
    "device.h",
    "ieee80211.h",
    "irq.h",
    "kernel.h",
    "memory.h",
    "module.h",
    "pci.h",
    "task-internal.h",
    "task.h",
    "time.h",
  ]
  deps = [
    ":driver_inspector",
    "//sdk/lib/stdcompat",
    "//src/connectivity/wlan/lib/common/cpp:common",
    "//zircon/system/ulib/sync",
  ]
  public_deps = [
    "//garnet/lib/wlan/protocol:protocol",
    "//sdk/banjo/ddk.hw.wlan.wlaninfo:ddk.hw.wlan.wlaninfo_banjo_c",
    "//sdk/banjo/fuchsia.hardware.pci:fuchsia.hardware.pci_banjo_c",
    "//sdk/banjo/fuchsia.hardware.wlan.mac:fuchsia.hardware.wlan.mac_banjo_c",
    "//src/lib/ddk",
    "//zircon/system/public",
    "//zircon/system/ulib/async",
  ]
  public_configs = [
    "//src/iwlwifi:fuchsia_config",
  ]
}

# Support for exporting driver data from the Inspect tree.
source_set("driver_inspector") {
  sources = [ "driver-inspector.cc" ]
  public = [ "driver-inspector.h" ]
  public_deps = [
    "//sdk/lib/stdcompat",
    "//zircon/system/public",
    "//zircon/system/ulib/inspect",
  ]
}

driver_bind_rules("fuchsia_bind") {
  rules = "iwlwifi.bind"
  header_output = "iwlwifi-bind.h"
  tests = "iwlwifi-bind-tests.json"
  deps = [ "//src/devices/bind/fuchsia.pci" ]
}

# Fuchsia DDK device bindings for the iwlwifi driver.
source_set("fuchsia_device") {
  sources = [
    "bind.cc",
    "mvm-mlme.cc",
    "mvm-mlme.h",
    "pcie-device.cc",
    "pcie-device.h",
    "wlanmac-device.cc",
    "wlanmac-device.h",
    "wlanphy-impl-device.cc",
    "wlanphy-impl-device.h",
  ]
  deps = [
    ":driver_inspector",
    ":fuchsia_bind",
    ":platform",
    "//sdk/banjo/ddk.hw.wlan.wlaninfo:ddk.hw.wlan.wlaninfo_banjo_cpp",
    "//sdk/banjo/fuchsia.hardware.wlan.mac:fuchsia.hardware.wlan.mac_banjo_cpp",
    "//sdk/banjo/fuchsia.hardware.wlanphyimpl:fuchsia.hardware.wlanphyimpl_banjo_cpp",
    "//sdk/fidl/fuchsia.wlan.common:fuchsia.wlan.common_banjo_cpp",
    "//sdk/fidl/fuchsia.wlan.ieee80211:fuchsia.wlan.ieee80211_llcpp",
    "//sdk/fidl/fuchsia.wlan.internal:fuchsia.wlan.internal_banjo_cpp",
    "//src/iwlwifi:core",
    "//src/iwlwifi/cfg",
    "//src/iwlwifi/mvm",
    "//src/iwlwifi/pcie",
    "//src/devices/lib/driver",
    "//src/lib/ddk",
    "//src/lib/ddktl",
    "//zircon/system/public",
    "//zircon/system/ulib/async-loop:async-loop-cpp",
    "//zircon/system/ulib/async-loop:async-loop-default",
    "//zircon/system/ulib/fbl",
  ]
  friend =
      [ "//src/iwlwifi/test:*" ]

  # TODO(https://fxbug.dev/58162): delete the below and fix compiler warnings
  configs += [ "//build/config:Wno-conversion" ]
}
