diff --git a/kernel/include/kernel/Networking/E1000.h b/kernel/include/kernel/Networking/E1000.h index dad29613..a5246ce0 100644 --- a/kernel/include/kernel/Networking/E1000.h +++ b/kernel/include/kernel/Networking/E1000.h @@ -13,6 +13,7 @@ namespace Kernel class E1000 final : public NetworkDriver { public: + static bool probe(PCI::Device&); static BAN::ErrorOr> create(PCI::Device&); ~E1000(); diff --git a/kernel/kernel/Networking/E1000.cpp b/kernel/kernel/Networking/E1000.cpp index be45183e..666e5408 100644 --- a/kernel/kernel/Networking/E1000.cpp +++ b/kernel/kernel/Networking/E1000.cpp @@ -112,6 +112,45 @@ namespace Kernel volatile uint16_t special; } __attribute__((packed)); + // https://www.intel.com/content/dam/doc/manual/pci-pci-x-family-gbe-controllers-software-dev-manual.pdf (section 5.2) + bool E1000::probe(PCI::Device& pci_device) + { + // Intel device + if (pci_device.vendor_id() != 0x8086) + return false; + + switch (pci_device.device_id()) + { + case 0x1019: + case 0x101A: + case 0x1010: + case 0x1012: + case 0x101D: + case 0x1079: + case 0x107A: + case 0x107B: + case 0x100F: + case 0x1011: + case 0x1026: + case 0x1027: + case 0x1028: + case 0x1107: + case 0x1112: + case 0x1013: + case 0x1018: + case 0x1076: + case 0x1077: + case 0x1078: + case 0x1017: + case 0x1016: + case 0x100e: + case 0x1015: + return true; + default: + return false; + } + } + BAN::ErrorOr> E1000::create(PCI::Device& pci_device) { E1000* e1000 = new E1000(); diff --git a/kernel/kernel/PCI.cpp b/kernel/kernel/PCI.cpp index 3c69bd48..5fa243f0 100644 --- a/kernel/kernel/PCI.cpp +++ b/kernel/kernel/PCI.cpp @@ -173,8 +173,9 @@ namespace Kernel::PCI switch (pci_device.subclass()) { case 0x00: - if (auto res = E1000::create(pci_device); res.is_error()) - dprintln("E1000: {}", res.error()); + if (E1000::probe(pci_device)) + if (auto res = E1000::create(pci_device); res.is_error()) + dprintln("E1000: {}", res.error()); break; default: dprintln("unsupported ethernet device (pci {2H}.{2H}.{2H})", pci_device.class_code(), pci_device.subclass(), pci_device.prog_if());