summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-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
-rw-r--r--src/kernel/KernelKit/PCI/Device.h2
-rw-r--r--src/kernel/amd64-ci.make2
-rw-r--r--src/kernel/amd64-desktop.make2
5 files changed, 46 insertions, 24 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.
/***********************************************************************************/
diff --git a/src/kernel/KernelKit/PCI/Device.h b/src/kernel/KernelKit/PCI/Device.h
index b7737385..1adc9f24 100644
--- a/src/kernel/KernelKit/PCI/Device.h
+++ b/src/kernel/KernelKit/PCI/Device.h
@@ -51,7 +51,7 @@ class Device final {
}
public:
- UShort DeviceId();
+ UInt16 DeviceId();
UShort VendorId();
UShort InterfaceId();
UChar Class();
diff --git a/src/kernel/amd64-ci.make b/src/kernel/amd64-ci.make
index dcb1c97e..71e350e5 100644
--- a/src/kernel/amd64-ci.make
+++ b/src/kernel/amd64-ci.make
@@ -5,7 +5,7 @@
CXX = x86_64-w64-mingw32-g++
LD = x86_64-w64-mingw32-ld
-CCFLAGS = -fshort-wchar -D__nekernel_dma_best_align=8 -D__nekernel_max_cores=8 -c -D__NE_AMD64__ -D__NEOSKRNL__ -D__NE_VEPM__ -Werror -Wall -Wpedantic -Wextra -mno-red-zone -fno-rtti -fno-exceptions -std=c++20 -D__NE_SUPPORT_NX__ -O0 -I../vendor -D__FSKIT_INCLUDES_NEFS__ -D__NEKERNEL__ -D__HAVE_NE_API__ -D__FREESTANDING__ -D__NE_VIRTUAL_MEMORY_SUPPORT__ -D__NE_AUTO_FORMAT__ -D__NE__ -I./ -I../ -I../boot
+CCFLAGS = -fshort-wchar -D__nekernel_dma_best_align=8 -D__HALKIT_INCLUDES_BNID__=1 -D__nekernel_max_cores=8 -c -D__NE_AMD64__ -D__NEOSKRNL__ -D__NE_VEPM__ -Werror -Wall -Wpedantic -Wextra -mno-red-zone -fno-rtti -fno-exceptions -std=c++20 -D__NE_SUPPORT_NX__ -O0 -I../vendor -D__FSKIT_INCLUDES_NEFS__ -D__NEKERNEL__ -D__HAVE_NE_API__ -D__FREESTANDING__ -D__NE_VIRTUAL_MEMORY_SUPPORT__ -D__NE_AUTO_FORMAT__ -D__NE__ -I./ -I../ -I../boot
ASM = nasm
diff --git a/src/kernel/amd64-desktop.make b/src/kernel/amd64-desktop.make
index 4afcdfd2..73bb2f43 100644
--- a/src/kernel/amd64-desktop.make
+++ b/src/kernel/amd64-desktop.make
@@ -5,7 +5,7 @@
CXX = x86_64-w64-mingw32-g++
LD = x86_64-w64-mingw32-ld
-CCFLAGS = -fshort-wchar -D__nekernel_dma_pool_start=0x1000000 -D__nekernel_dma_pool_size=0x1000000 \
+CCFLAGS = -fshort-wchar -D__nekernel_dma_pool_start=0x1000000 -D__HALKIT_INCLUDES_BNID__=1 -D__nekernel_dma_pool_size=0x1000000 \
-D__nekernel_halkit_include_processor="<HALKit/AMD64/Processor.h>" -D__nekernel_max_cores=8 -c -D__NE_AMD64__ -D__NEOSKRNL__ -D__NE_VEPM__ -Wall -Wpedantic -Wextra -mno-red-zone -fno-rtti -fno-exceptions -std=c++20 -D__nekernel_dma_best_align=8 -D__FSKIT_INCLUDES_OPENHEFS__ -D__FSKIT_INCLUDES_EXT2__ -D__NE_SUPPORT_NX__ -O0 -I../vendor -D__NEKERNEL__ -D__HAVE_NE_API__ -D__FREESTANDING__ -D__NE_VIRTUAL_MEMORY_SUPPORT__ -D__NE_AUTO_FORMAT__ -D__NE__ -I./ -I../ -I../boot
ASM = nasm