# Copyright 2019 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")
import("//build/drivers.gni")

bind_library("fuchsia.intel.e1000") {
  source = "fuchsia.intel.e1000.bind"
}

driver_bind_rules("e1000_bind") {
  rules = "e1000.bind"
  header_output = "e1000_bind.h"
  tests = "bind-tests.json"
  deps = [
    ":fuchsia.intel.e1000",
    "//src/devices/bind/fuchsia.driver.framework",
    "//src/devices/bind/fuchsia.pci",
  ]
}

fuchsia_driver("e1000-driver") {
  output_name = "e1000"
  configs += [
    "//build/config:all_source",
    "//build/config/fuchsia:enable_zircon_asserts",
  ]
  sources = [
    "e1000_80003es2lan.c",
    "e1000_82540.c",
    "e1000_82541.c",
    "e1000_82542.c",
    "e1000_82543.c",
    "e1000_82571.c",
    "e1000_82575.c",
    "e1000_api.c",
    "e1000_i210.c",
    "e1000_ich8lan.c",
    "e1000_mac.c",
    "e1000_manage.c",
    "e1000_mbx.c",
    "e1000_nvm.c",
    "e1000_osdep.c",
    "e1000_phy.c",
    "e1000_vf.c",
    "fuchsia.c",
  ]
  deps = [
    ":e1000_bind",
    "//sdk/banjo/fuchsia.hardware.ethernet:fuchsia.hardware.ethernet_banjo_cpp",
    "//src/devices/lib/driver",
    "//src/devices/lib/mmio",
    "//src/devices/pci/lib/device-protocol-pci",
    "//src/devices/pci/lib/fuchsia.hardware.pci:fuchsia.hardware.pci_banjo_cpp",
    "//src/devices/pci/lib/pci",
    "//src/lib/ddk",
    "//src/lib/listnode",
  ]
  configs += [ "//build/config:Wno-conversion" ]
}

fuchsia_driver_component("e1000") {
  component_name = "e1000"
  deps = [ ":e1000-driver" ]
  info = "e1000-info.json"
  colocate = true
  root_resource = true
}

group("tests") {
  testonly = true
  deps = [ ":e1000_bind_test" ]
}
