This commit is contained in:
maksw committed 2026-10-27 09:28:31 +01:00
1 parent d36f19509c
commit 30d20457f0
309 files changed
+121746 -1963

No files matched your search

+28 -83
View File
@@ -4,9 +4,6 @@
#include "rtl8139.h"
static DRIVER_OBJECT gRtl8139Driver;
static RTL8139_DEVICE* gRtl8139Devices[RTL8139_MAX_DEVICES];
static uint32_t gRtl8139DeviceCount;
static SPINLOCK gRtl8139RegistryLock = SPINLOCK_INIT;
static const IO_DEVICE_ID gRtl8139Ids[] = {
{ IoBusPci, { "PCI\\VEN_10EC&DEV_8139", sizeof("PCI\\VEN_10EC&DEV_8139") - 1 } },
@@ -273,71 +270,18 @@ static void Rtl8139DpcRoutine(KDPC* dpc, void* context, void* systemArgument1, v
DbgPrint("RTL8139: interrupt error bits=0x%04x\n", status);
}
// Registers device.
static KSTATUS Rtl8139RegisterDevice(RTL8139_DEVICE* r) {
if (!r) return NTLSTATUS_INVALID_PARAMETER;
uintptr_t flags = KeAcquireSpinlock(&gRtl8139RegistryLock);
for (uint32_t i = 0; i < gRtl8139DeviceCount; i++) {
if (gRtl8139Devices[i] == r) {
KeReleaseSpinlock(&gRtl8139RegistryLock, flags);
return NTLSTATUS_SUCCESS;
}
}
if (gRtl8139DeviceCount >= RTL8139_MAX_DEVICES) {
KeReleaseSpinlock(&gRtl8139RegistryLock, flags);
return NTLSTATUS_NO_MEMORY;
}
gRtl8139Devices[gRtl8139DeviceCount++] = r;
KeReleaseSpinlock(&gRtl8139RegistryLock, flags);
return NTLSTATUS_SUCCESS;
}
// Implements the unregister Device operation.
static void Rtl8139UnregisterDevice(RTL8139_DEVICE* r) {
if (!r) return;
uintptr_t flags = KeAcquireSpinlock(&gRtl8139RegistryLock);
for (uint32_t i = 0; i < gRtl8139DeviceCount; i++) {
if (gRtl8139Devices[i] == r) {
gRtl8139Devices[i] = gRtl8139Devices[gRtl8139DeviceCount - 1u];
gRtl8139Devices[gRtl8139DeviceCount - 1u] = (RTL8139_DEVICE*)0;
gRtl8139DeviceCount--;
break;
}
}
KeReleaseSpinlock(&gRtl8139RegistryLock, flags);
}
// Implements the isr operation.
static void Rtl8139Isr(void) {
RTL8139_DEVICE* snapshot[RTL8139_MAX_DEVICES];
uint32_t count = 0;
static void Rtl8139Isr(void* context) {
RTL8139_DEVICE* r = (RTL8139_DEVICE*)context;
if (!r || !r->Started || r->Removed || r->SurpriseRemoved) return;
uint16_t status = Rtl8139Read16(r, RTL8139_REG_ISR);
status &= RTL8139_INTR_ENABLES;
if (!status || status == 0xFFFFu)
return;
uintptr_t flags = KeAcquireSpinlock(&gRtl8139RegistryLock);
count = gRtl8139DeviceCount;
if (count > RTL8139_MAX_DEVICES)
count = RTL8139_MAX_DEVICES;
for (uint32_t i = 0; i < count; i++)
snapshot[i] = gRtl8139Devices[i];
KeReleaseSpinlock(&gRtl8139RegistryLock, flags);
for (uint32_t i = 0; i < count; i++) {
RTL8139_DEVICE* r = snapshot[i];
if (!r || !r->Started || r->Removed || r->SurpriseRemoved)
continue;
uint16_t status = Rtl8139Read16(r, RTL8139_REG_ISR);
status &= RTL8139_INTR_ENABLES;
if (!status || status == 0xFFFFu)
continue;
Rtl8139Write16(r, RTL8139_REG_ISR, status);
r->PendingIsr |= status;
KeInsertQueueDpc(&r->Dpc, (void*)0, (void*)0);
}
Rtl8139Write16(r, RTL8139_REG_ISR, status);
r->PendingIsr |= status;
KeInsertQueueDpc(&r->Dpc, (void*)0, (void*)0);
}
// Implements the send Frame operation.
@@ -478,12 +422,10 @@ static KSTATUS Rtl8139StartDevice(RTL8139_DEVICE* r) {
return st;
}
st = PciGetInterrupt(r->Pdo, &r->Irq);
if (!KSUCCESS(st) || r->Irq == 0xFFu) {
DbgPrint("RTL8139: no legacy PCI IRQ line wired\n");
return KSUCCESS(st) ? NTLSTATUS_NOT_SUPPORTED : st;
}
r->InterruptRequest.Routine = Rtl8139Isr;
r->InterruptRequest.Context = r;
r->InterruptRequest.Affinity = 0;
r->InterruptRequest.Interrupt = (KE_INTERRUPT*)0;
Rtl8139Write8(r, RTL8139_REG_CONFIG1, 0x00);
st = Rtl8139Reset(r);
if (!KSUCCESS(st)) {
@@ -492,11 +434,10 @@ static KSTATUS Rtl8139StartDevice(RTL8139_DEVICE* r) {
}
Rtl8139ReadMac(r);
DbgPrint("RTL8139: MAC %02x:%02x:%02x:%02x:%02x:%02x irq=%u\n",
DbgPrint("RTL8139: MAC %02x:%02x:%02x:%02x:%02x:%02x\n",
r->NetDevice.HardwareAddress[0], r->NetDevice.HardwareAddress[1],
r->NetDevice.HardwareAddress[2], r->NetDevice.HardwareAddress[3],
r->NetDevice.HardwareAddress[4], r->NetDevice.HardwareAddress[5],
r->Irq);
r->NetDevice.HardwareAddress[4], r->NetDevice.HardwareAddress[5]);
st = Rtl8139AllocateDma(r);
if (!KSUCCESS(st))
@@ -508,13 +449,16 @@ static KSTATUS Rtl8139StartDevice(RTL8139_DEVICE* r) {
r->NetDevice.DriverContext = r;
r->NetDevice.SendFrame = Rtl8139SendFrame;
st = Rtl8139RegisterDevice(r);
bool message;
st = PciConnectInterrupts(r->Pdo, &r->InterruptRequest, 1u, &message);
if (!KSUCCESS(st)) {
Rtl8139ReleaseDma(r);
return st;
}
KeIrqRegister(r->Irq, Rtl8139Isr);
KE_INTERRUPT_INFO route;
if (KSUCCESS(KeInterruptQuery(r->InterruptRequest.Interrupt, &route)))
DbgPrint("RTL8139: cpu=%u vector=0x%02x mode=%s\n",
route.CpuIndex, route.Vector, message ? "MSI/MSI-X" : "INTx");
r->Started = true;
Rtl8139ProgramHardware(r);
r->Fdo->PnpState = DevicePnpStarted;
@@ -522,12 +466,13 @@ static KSTATUS Rtl8139StartDevice(RTL8139_DEVICE* r) {
st = NetRegisterDevice(&r->NetDevice);
if (!KSUCCESS(st)) {
Rtl8139StopDma(r);
Rtl8139UnregisterDevice(r);
if (r->InterruptRequest.Interrupt)
PciDisconnectInterrupts(r->Pdo, &r->InterruptRequest, 1u);
Rtl8139ReleaseDma(r);
return st;
}
DbgPrint("RTL8139: initialized; RX/TX enabled on IRQ %u\n", r->Irq);
DbgPrint("RTL8139: initialized; RX/TX interrupt connected\n");
return NTLSTATUS_SUCCESS;
}
@@ -562,7 +507,8 @@ KSTATUS Rtl8139DispatchPnp(DEVICE_OBJECT* device, IRP* irp) {
r->Removed = true;
device->PnpState = DevicePnpDeleted;
Rtl8139StopDma(r);
Rtl8139UnregisterDevice(r);
if (r->InterruptRequest.Interrupt)
PciDisconnectInterrupts(r->Pdo, &r->InterruptRequest, 1u);
Rtl8139ReleaseDma(r);
IoDetachDevice(device);
IoDeleteDevice(device);
@@ -589,7 +535,7 @@ KSTATUS Rtl8139AddDevice(DRIVER_OBJECT* driver, DEVICE_OBJECT* physicalDeviceObj
r->Magic = RTL8139_DEVICE_MAGIC;
r->Fdo = fdo;
r->Pdo = physicalDeviceObject;
r->Irq = 0xFFu;
r->PciInfo.InterruptLine = 0xFFu;
r->TxLock = (SPINLOCK)SPINLOCK_INIT;
r->LowerDevice = IoAttachDeviceToDeviceStack(fdo, physicalDeviceObject);
@@ -607,7 +553,6 @@ static KSTATUS DriverInitialize(NTL_MODULE* module) {
DbgPrint("RTL8139: driver loading...\n");
gRtl8139DeviceCount = 0;
memset(&gRtl8139Driver, 0, sizeof(gRtl8139Driver));
IoInitializeDriverObject(&gRtl8139Driver, SYS_SV_LITERAL("rtl8139"));
+1 -1
View File
@@ -105,7 +105,7 @@ typedef struct RTL8139_DEVICE {
PCI_DEVICE_INFO PciInfo;
PCI_BAR RegisterBar;
uint64_t RegisterBytes;
uint8_t Irq;
PCI_INTERRUPT_REQUEST InterruptRequest;
bool Started;
bool Removed;