diff options
| author | Amlal El Mahrouss <amlal@nekernel.org> | 2026-03-16 12:08:15 +0100 |
|---|---|---|
| committer | Amlal El Mahrouss <amlal@nekernel.org> | 2026-03-16 12:09:13 +0100 |
| commit | 3f47c53398a2cd10fe1b205e1393c3ceab4c675c (patch) | |
| tree | 59e3a3ca801f7c7f01b75c4a470af8fe4b8f8309 /src/kernel/HALKit | |
| parent | 35fb9574c5efc426491f7ce55689e0f911890e98 (diff) | |
Signed-off-by: Amlal El Mahrouss <amlal@nekernel.org>
Diffstat (limited to 'src/kernel/HALKit')
| -rw-r--r-- | src/kernel/HALKit/AMD64/HalKernelMain.cpp | 6 | ||||
| -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. /***********************************************************************************/ |
