summaryrefslogtreecommitdiffhomepage
path: root/src/kernel/HALKit/AMD64
diff options
context:
space:
mode:
authorAmlal El Mahrouss <amlal@nekernel.org>2026-03-16 12:08:15 +0100
committerAmlal El Mahrouss <amlal@nekernel.org>2026-03-16 12:09:13 +0100
commit3f47c53398a2cd10fe1b205e1393c3ceab4c675c (patch)
tree59e3a3ca801f7c7f01b75c4a470af8fe4b8f8309 /src/kernel/HALKit/AMD64
parent35fb9574c5efc426491f7ce55689e0f911890e98 (diff)
[FEAT] Kernel: Finally include the BNID network driver when compiling NeKernel.HEADdevelop
Signed-off-by: Amlal El Mahrouss <amlal@nekernel.org>
Diffstat (limited to 'src/kernel/HALKit/AMD64')
-rw-r--r--src/kernel/HALKit/AMD64/HalKernelMain.cpp6
-rw-r--r--src/kernel/HALKit/AMD64/Network/Generic+Basic+BNID.cpp (renamed from src/kernel/HALKit/AMD64/Network/Generic+Basic+RTL8139.cpp)58
2 files changed, 43 insertions, 21 deletions
diff --git a/src/kernel/HALKit/AMD64/HalKernelMain.cpp b/src/kernel/HALKit/AMD64/HalKernelMain.cpp
index 7468b76d..57f980c6 100644
--- a/src/kernel/HALKit/AMD64/HalKernelMain.cpp
+++ b/src/kernel/HALKit/AMD64/HalKernelMain.cpp
@@ -133,6 +133,8 @@ EXTERN_C Kernel::Int32 hal_init_platform(Kernel::HEL::BootInfoHeader* handover_h
return kEfiFail;
}
+EXTERN_C BOOL rtl_init_nic_rtl8139();
+
EXTERN_C Kernel::Void hal_real_init(Kernel::Void) {
HAL::mp_init_cores(kHandoverHeader->f_HardwareTables.f_VendorPtr);
@@ -161,6 +163,10 @@ EXTERN_C Kernel::Void hal_real_init(Kernel::Void) {
UserProcessScheduler::The().SwitchTeam(kMidUserTeam);
+#ifdef __HALKIT_INCLUDES_BNID__
+ rtl_init_nic_rtl8139();
+#endif
+
while (YES);
}
#endif // ifndef __NE_MODULAR_KERNEL_COMPONENTS__
diff --git a/src/kernel/HALKit/AMD64/Network/Generic+Basic+RTL8139.cpp b/src/kernel/HALKit/AMD64/Network/Generic+Basic+BNID.cpp
index aacda36c..4c1d0f1f 100644
--- a/src/kernel/HALKit/AMD64/Network/Generic+Basic+RTL8139.cpp
+++ b/src/kernel/HALKit/AMD64/Network/Generic+Basic+BNID.cpp
@@ -5,66 +5,82 @@
#include <DmaKit/DmaPool.h>
#include <HALKit/AMD64/Processor.h>
+#include <KernelKit/PCI/Iterator.h>
#include <modules/ACPI/ACPIFactoryInterface.h>
+/// @note BNID (RTL8139' Basic Network Interface) driver
+
+#define kNetDevID (0x8139)
+#define kNetSubClass (0x10EC)
+
using namespace Kernel;
using namespace Kernel::HAL;
STATIC UInt16 kRTLIOBase = 0xFFFF;
-STATIC BOOL kTXRXEnabled = NO;
-
STATIC UInt32 kRXOffset = 0UL;
STATIC constexpr CONST UInt32 kRXBufferSize = 8192 + 16 + 1500;
STATIC UInt8* kRXUpperLayer = nullptr;
STATIC UInt8* kRXBuffer = nullptr;
+STATIC PCI::Device kNetDev;
+
/***********************************************************************************/
-///@brief RTL8139 Init routine.
+///@brief BNID Init routine.
/***********************************************************************************/
-EXTERN_C BOOL rtl_init_nic_rtl8139(UInt16 io_base) {
+EXTERN_C BOOL rtl_init_nic_rtl8139() {
+ STATIC BOOL kTXRXEnabled = NO;
if (kTXRXEnabled) return NO;
- kRTLIOBase = io_base;
+ PCI::Iterator iterator(Types::PciDeviceKind::NetworkController, 0x00);
- MUST_PASS(io_base != 0xFFFF);
+ for (SizeT device_index = 0; device_index < NE_BUS_COUNT; ++device_index) {
+ kNetDev = iterator[device_index].Leak(); // Leak device.
- kRXBuffer = reinterpret_cast<UInt8*>(rtl_dma_alloc(sizeof(UInt8) * kRXBufferSize, 0));
+ if (kNetDev.VendorId() == kNetSubClass && kNetDev.DeviceId() == kNetDevID) {
+ kNetDev.EnableMmio();
+ kNetDev.BecomeBusMaster();
+
+ break;
+ }
+ }
+
+ kRTLIOBase = kNetDev.Bar(0);
- MUST_PASS(kRXBuffer);
+ MUST_PASS(kRTLIOBase != 0xFFFF);
+
+ kRXBuffer = reinterpret_cast<UInt8*>(rtl_dma_alloc(sizeof(UInt8) * kRXBufferSize, 0));
/// Reset first.
- rt_out8(io_base + 0x37, 0x10);
+ rt_out8(kRTLIOBase + 0x37, 0x10);
UInt16 timeout = 0U;
- while (rt_in8(io_base + 0x37) & 0x10) {
+ while (rt_in8(kRTLIOBase + 0x37) & 0x10) {
++timeout;
if (timeout > 0x1000) break;
}
- if (timeout <= 0x1000) {
- return NO;
- }
-
- rt_out32(io_base + 0x30, (UInt32) (UIntPtr) kRXBuffer);
+ rt_out32(kRTLIOBase + 0x30, (UInt32) (UIntPtr) kRXBuffer);
- rt_out8(io_base + 0x37, 0x0C);
+ rt_out8(kRTLIOBase + 0x37, 0x0C);
- rt_out32(io_base + 0x44, 0xF | (1 << 7));
+ rt_out32(kRTLIOBase + 0x44, 0xF | (1 << 7));
- rt_out16(io_base + 0x3C, 0x0005);
+ rt_out16(kRTLIOBase + 0x3C, 0x0005);
kTXRXEnabled = YES;
+ kout << "The Basic Network Interface Driver (BNID) has been initialized.\r";
+
return YES;
}
/***********************************************************************************/
-/// @brief RTL8139 I/O interrupt handler.
+/// @brief BNID I/O interrupt handler.
/// @param rsp stack pointer.
/// @note This function is called when the device interrupts to retrieve network data.
/***********************************************************************************/
@@ -105,7 +121,7 @@ EXTERN_C Void rtl_rtl8139_interrupt_handler(UIntPtr rsp) {
}
/***********************************************************************************/
-/// @brief RTL8139 get upper layer function
+/// @brief BNID get upper layer function
/// @return the upper layer.
/// @retval nullptr if no upper layer is set.
/// @retval pointer to the upper layer if set.
@@ -116,7 +132,7 @@ EXTERN_C UInt8* rtl_rtl8139_get_upper_layer() {
}
/***********************************************************************************/
-/// @brief RTL8139 set upper layer function
+/// @brief BNID set upper layer function
/// @param layer the upper layer.
/***********************************************************************************/