From 31c0898bffcd4e79b7c9e7f7d2cd7226e804cead Mon Sep 17 00:00:00 2001 From: Alex Date: Thu, 23 Mar 2023 20:46:35 +0200 Subject: [PATCH] Update drivers after the new DAPI --- Audio/AudioCodec97/AudioCodec97Driver.cpp | 93 +++++--- Generic/ExampleDriver/Example.cpp | 15 +- Input/PS2Mouse/PS2MouseDriver.cpp | 223 +++++++++--------- Input/VMwareMouse/VMwareMouseDriver.cpp | 68 +++--- .../VirtualBoxMouse/VirtualBoxMouseDriver.cpp | 12 +- Network/AMDPCNET/pcnet.cpp | 11 +- Network/IntelGigabit/IntelGigabit.cpp | 39 +-- Network/RTL8139/rtl8139.cpp | 37 +-- Network/RTL8169/rtl8169.cpp | 11 +- Network/Virtio/Virtio.cpp | 11 +- Storage/AHCI/AHCI.cpp | 8 + Storage/ATA/ATA.cpp | 29 ++- 12 files changed, 304 insertions(+), 253 deletions(-) diff --git a/Audio/AudioCodec97/AudioCodec97Driver.cpp b/Audio/AudioCodec97/AudioCodec97Driver.cpp index 8b452e99..8291acbf 100644 --- a/Audio/AudioCodec97/AudioCodec97Driver.cpp +++ b/Audio/AudioCodec97/AudioCodec97Driver.cpp @@ -4,6 +4,7 @@ extern "C" int DriverEntry(void *Data); int CallbackHandler(KernelCallback *Data); +int InterruptCallback(CPURegisters *Registers); HEAD(FexFormatType_Driver, FexOSType_Fennix, DriverEntry); @@ -16,6 +17,7 @@ __attribute__((section(".extended"))) FexExtended ExtendedHeader = { .TypeFlags = FexDriverInputTypes_None, .OverrideOnConflict = false, .Callback = CallbackHandler, + .InterruptCallback = InterruptCallback, .Bind = { .Type = BIND_PCI, .PCI = { @@ -99,13 +101,20 @@ int CallbackHandler(KernelCallback *Data) DescriptorList = (BufferDescriptorList *)KAPI->Memory.RequestPage((sizeof(BufferDescriptorList) * DescriptorListLength) / KAPI->Memory.PageSize + 1); KAPI->Util.memset(DescriptorList, 0, sizeof(BufferDescriptorList) * DescriptorListLength); + uint16_t DLSampleCount = KAPI->Memory.PageSize / SampleSize; + char DLLogBuffer[128]; for (int i = 0; i < DescriptorListLength; i++) { - DescriptorList[i] = { - .Address = (uint32_t)(uint64_t)KAPI->Memory.RequestPage(sizeof(uint16_t *) / KAPI->Memory.PageSize + 1), - .SampleCount = (uint16_t)(KAPI->Memory.PageSize / SampleSize), - .Flags = 0, - }; + int DescriptorPages = sizeof(uint16_t *) / KAPI->Memory.PageSize + 1; + DescriptorList[i].Address = (uint32_t)(uint64_t)KAPI->Memory.RequestPage(DescriptorPages); + DescriptorList[i].SampleCount = DLSampleCount; + DescriptorList[i].Flags = 0; + KAPI->Util.sprintf(DLLogBuffer, "DescriptorList[%d] = { Address: 0x%x (%d %s), SampleCount: %d, Flags: 0x%x }", + i, + DescriptorList[i].Address, DescriptorPages, DescriptorPages == 1 ? "page" : "pages", + DescriptorList[i].SampleCount, + DescriptorList[i].Flags); + print(DLLogBuffer); } outw(BAR.MixerAddress + NAM_MasterVolume, MixerVolume(Volume, Volume, Mute)); @@ -236,10 +245,19 @@ int CallbackHandler(KernelCallback *Data) } case SendReason: { + for (size_t i = 0; i < 10; i++) + KAPI->Util.Sleep(1000); + return OK; unsigned char *Buffer = (unsigned char *)Data->AudioCallback.Send.Data; unsigned int Length = Data->AudioCallback.Send.Length; - if (Length % (SampleSize * Channels)) + if (Buffer == nullptr) + { + print("Invalid buffer."); + return INVALID_DATA; + } + + if ((Length == 0) || (Length % (SampleSize * Channels))) { print("Invalid buffer length."); return INVALID_DATA; @@ -270,10 +288,7 @@ int CallbackHandler(KernelCallback *Data) { long SampleCount = DescriptorList[(CurrentBDL + 1) % DescriptorListLength].SampleCount / Channels; if (SampleCount > 0) - { - // KAPI->Util.Sleep(SampleCount * 1000000 / SampleRate); // microseconds KAPI->Util.Sleep(SampleCount * 1000 / SampleRate); // milliseconds - } } } while (RemainingBDL >= DescriptorListLength - 1 && !(inw(BAR.BusMasterAddress + PCMOUT_Status) & TC_DMAControllerControl)); @@ -294,7 +309,7 @@ int CallbackHandler(KernelCallback *Data) do { - int Wrote = ((KAPI->Memory.PageSize > Length) ? Length : KAPI->Memory.PageSize); + int Wrote = (KAPI->Memory.PageSize > Length) ? Length : KAPI->Memory.PageSize; if (Wrote == 0) break; @@ -343,35 +358,6 @@ int CallbackHandler(KernelCallback *Data) print("Driver stopped."); break; } - case InterruptReason: - { - break; // Not working as expected - uint16_t Status = inw(BAR.MixerAddress + PCMOUT_Status); - - if (Status & TC_IOCInterruptEnable) - { - print("Interrupt on completion."); - } - else if (Status & TC_LastBufferEntryInterruptEnable) - { - print("Last buffer entry."); - // Stop DMA - outb(BAR.BusMasterAddress + PCMOUT_TransferControl, inb(BAR.BusMasterAddress + PCMOUT_TransferControl) & ~TC_DMAControllerControl); - } - else if (Status & TC_FifoERRORInterruptEnable) - { - print("FIFO error."); - } - else if (Status != 0x0) - { - char UnknownStatusText[64]; - KAPI->Util.sprintf(UnknownStatusText, "Unknown status: %#lx", Status); - print(UnknownStatusText); - } - - outw(BAR.MixerAddress + PCMOUT_Status, 0xFFFF); - break; - } default: { print("Unknown reason."); @@ -380,3 +366,32 @@ int CallbackHandler(KernelCallback *Data) } return OK; } + +int InterruptCallback(CPURegisters *) +{ + uint16_t Status = inw(BAR.MixerAddress + PCMOUT_Status); + + if (Status & TC_IOCInterruptEnable) + { + print("Interrupt on completion."); + } + else if (Status & TC_LastBufferEntryInterruptEnable) + { + print("Last buffer entry."); + // Stop DMA + outb(BAR.BusMasterAddress + PCMOUT_TransferControl, inb(BAR.BusMasterAddress + PCMOUT_TransferControl) & ~TC_DMAControllerControl); + } + else if (Status & TC_FifoERRORInterruptEnable) + { + print("FIFO error."); + } + else if (Status != 0x0) + { + char UnknownStatusText[64]; + KAPI->Util.sprintf(UnknownStatusText, "Unknown status: %#lx", Status); + print(UnknownStatusText); + } + + outw(BAR.MixerAddress + PCMOUT_Status, 0xFFFF); + return OK; +} diff --git a/Generic/ExampleDriver/Example.cpp b/Generic/ExampleDriver/Example.cpp index f2cb0e6a..70a53409 100644 --- a/Generic/ExampleDriver/Example.cpp +++ b/Generic/ExampleDriver/Example.cpp @@ -3,6 +3,7 @@ extern "C" int DriverEntry(void *Data); int CallbackHandler(KernelCallback *Data); +int InterruptCallback(CPURegisters *Registers); /* The driver is * This is a driver for Fennix Driver Entry Extended Header @@ -18,10 +19,11 @@ __attribute__((section(".extended"))) FexExtended ExtendedHeader = { .Name = "Example Driver", .Type = FexDriverType_Generic, .Callback = CallbackHandler, + .InterruptCallback = InterruptCallback, .Bind = { .Type = BIND_INTERRUPT, .Interrupt = { - .Vector = {0xFF}, + .Vector = {222}, // IRQ222 }}}}; // Global variable that holds the kernel API @@ -61,11 +63,6 @@ int CallbackHandler(KernelCallback *Data) print("Kernel acknowledged the driver."); break; } - case InterruptReason: - { - print("Interrupt received."); - break; - } case StopReason: { print("Driver stopped."); @@ -79,3 +76,9 @@ int CallbackHandler(KernelCallback *Data) } return OK; } + +int InterruptCallback(CPURegisters *) +{ + print("Interrupt received."); + return OK; +} diff --git a/Input/PS2Mouse/PS2MouseDriver.cpp b/Input/PS2Mouse/PS2MouseDriver.cpp index 4d2b5102..1a0b0fcf 100644 --- a/Input/PS2Mouse/PS2MouseDriver.cpp +++ b/Input/PS2Mouse/PS2MouseDriver.cpp @@ -6,6 +6,7 @@ extern "C" int DriverEntry(void *Data); int CallbackHandler(KernelCallback *Data); +int InterruptCallback(CPURegisters *Registers); HEAD(FexFormatType_Driver, FexOSType_Fennix, DriverEntry); @@ -18,10 +19,11 @@ __attribute__((section(".extended"))) FexExtended ExtendedHeader = { .TypeFlags = FexDriverInputTypes_Mouse, .OverrideOnConflict = false, .Callback = CallbackHandler, + .InterruptCallback = InterruptCallback, .Bind = { .Type = BIND_INTERRUPT, .Interrupt = { - .Vector = {0xC}, // IRQ12 + .Vector = {12}, // IRQ12 }}}}; KernelAPI *KAPI; @@ -156,115 +158,6 @@ int CallbackHandler(KernelCallback *Data) print("Driver stopped."); break; } - case InterruptReason: - { - uint8_t Data = inb(0x60); - - if (__builtin_expect(!!(PacketReady), 0)) - { - bool XNegative, YNegative, XOverflow, YOverflow; - - if (Packet[0] & PS2XSign) - XNegative = true; - else - XNegative = false; - - if (Packet[0] & PS2YSign) - YNegative = true; - else - YNegative = false; - - if (Packet[0] & PS2XOverflow) - XOverflow = true; - else - XOverflow = false; - - if (Packet[0] & PS2YOverflow) - YOverflow = true; - else - YOverflow = false; - - if (!XNegative) - { - MouseX += Packet[1]; - if (XOverflow) - MouseX += 255; - } - else - { - Packet[1] = 256 - Packet[1]; - MouseX -= Packet[1]; - if (XOverflow) - MouseX -= 255; - } - - if (!YNegative) - { - MouseY -= Packet[2]; - if (YOverflow) - MouseY -= 255; - } - else - { - Packet[2] = 256 - Packet[2]; - MouseY += Packet[2]; - if (YOverflow) - MouseY += 255; - } - - uint32_t Width = KAPI->Display.GetWidth(); - uint32_t Height = KAPI->Display.GetHeight(); - - if (MouseX < 0) - MouseX = 0; - - if ((uint32_t)MouseX > Width - 1) - MouseX = Width - 1; - - if (MouseY < 0) - MouseY = 0; - if ((uint32_t)MouseY > Height - 1) - MouseY = Height - 1; - - MouseLeft = 0; - MouseMiddle = 0; - MouseRight = 0; - - if (Packet[0] & PS2LeftButton) - MouseLeft = 1; - if (Packet[0] & PS2MiddleButton) - MouseMiddle = 1; - if (Packet[0] & PS2RightButton) - MouseRight = 1; - PacketReady = false; - } - - switch (Cycle) - { - case 0: - { - if ((Data & 0b00001000) == 0) - break; - Packet[0] = Data; - Cycle++; - break; - } - case 1: - { - Packet[1] = Data; - Cycle++; - break; - } - case 2: - { - Packet[2] = Data; - PacketReady = true; - Cycle = 0; - break; - } - } - break; - } default: { print("Unknown reason."); @@ -273,3 +166,113 @@ int CallbackHandler(KernelCallback *Data) } return OK; } + +int InterruptCallback(CPURegisters *) +{ + uint8_t Data = inb(0x60); + + if (__builtin_expect(!!(PacketReady), 0)) + { + bool XNegative, YNegative, XOverflow, YOverflow; + + if (Packet[0] & PS2XSign) + XNegative = true; + else + XNegative = false; + + if (Packet[0] & PS2YSign) + YNegative = true; + else + YNegative = false; + + if (Packet[0] & PS2XOverflow) + XOverflow = true; + else + XOverflow = false; + + if (Packet[0] & PS2YOverflow) + YOverflow = true; + else + YOverflow = false; + + if (!XNegative) + { + MouseX += Packet[1]; + if (XOverflow) + MouseX += 255; + } + else + { + Packet[1] = 256 - Packet[1]; + MouseX -= Packet[1]; + if (XOverflow) + MouseX -= 255; + } + + if (!YNegative) + { + MouseY -= Packet[2]; + if (YOverflow) + MouseY -= 255; + } + else + { + Packet[2] = 256 - Packet[2]; + MouseY += Packet[2]; + if (YOverflow) + MouseY += 255; + } + + uint32_t Width = KAPI->Display.GetWidth(); + uint32_t Height = KAPI->Display.GetHeight(); + + if (MouseX < 0) + MouseX = 0; + + if ((uint32_t)MouseX > Width - 1) + MouseX = Width - 1; + + if (MouseY < 0) + MouseY = 0; + if ((uint32_t)MouseY > Height - 1) + MouseY = Height - 1; + + MouseLeft = 0; + MouseMiddle = 0; + MouseRight = 0; + + if (Packet[0] & PS2LeftButton) + MouseLeft = 1; + if (Packet[0] & PS2MiddleButton) + MouseMiddle = 1; + if (Packet[0] & PS2RightButton) + MouseRight = 1; + PacketReady = false; + } + + switch (Cycle) + { + case 0: + { + if ((Data & 0b00001000) == 0) + break; + Packet[0] = Data; + Cycle++; + break; + } + case 1: + { + Packet[1] = Data; + Cycle++; + break; + } + case 2: + { + Packet[2] = Data; + PacketReady = true; + Cycle = 0; + break; + } + } + return OK; +} diff --git a/Input/VMwareMouse/VMwareMouseDriver.cpp b/Input/VMwareMouse/VMwareMouseDriver.cpp index 4dcf986f..d154e34b 100644 --- a/Input/VMwareMouse/VMwareMouseDriver.cpp +++ b/Input/VMwareMouse/VMwareMouseDriver.cpp @@ -6,6 +6,7 @@ extern "C" int DriverEntry(void *Data); int CallbackHandler(KernelCallback *Data); +int InterruptCallback(CPURegisters *Registers); HEAD(FexFormatType_Driver, FexOSType_Fennix, DriverEntry); @@ -18,10 +19,11 @@ __attribute__((section(".extended"))) FexExtended ExtendedHeader = { .TypeFlags = FexDriverInputTypes_Mouse, .OverrideOnConflict = true, .Callback = CallbackHandler, + .InterruptCallback = InterruptCallback, .Bind = { .Type = BIND_INTERRUPT, .Interrupt = { - .Vector = {0xC}, // IRQ12 + .Vector = {12}, // IRQ12 }}}}; KernelAPI *KAPI; @@ -240,38 +242,6 @@ int CallbackHandler(KernelCallback *Data) print("Driver stopped."); break; } - case InterruptReason: - { - uint8_t Data = inb(0x60); - (void)Data; - VMwareCommand cmd; - cmd.bx = 0; - cmd.command = CMD_ABSPOINTER_STATUS; - CommandSend(&cmd); - - if (cmd.ax == 0xFFFF0000) - { - print("VMware mouse is not connected?"); - Relative(); - Absolute(); - return ERROR; - } - if ((cmd.ax & 0xFFFF) < 4) - return ERROR; - - cmd.bx = 4; - cmd.command = CMD_ABSPOINTER_DATA; - CommandSend(&cmd); - - int flags = (cmd.ax & 0xFFFF0000) >> 16; /* Not important */ - (void)flags; - MouseButton = (cmd.ax & 0xFFFF); /* 0x10 = Right, 0x20 = Left, 0x08 = Middle */ - MouseX = cmd.bx; /* Both X and Y are scaled from 0 to 0xFFFF */ - MouseY = cmd.cx; /* You should map these somewhere to the actual resolution. */ - MouseZ = (int8_t)cmd.dx; /* Z is a single signed byte indicating scroll direction. */ - break; - } - default: { print("Unknown reason."); @@ -280,3 +250,35 @@ int CallbackHandler(KernelCallback *Data) } return OK; } + +int InterruptCallback(CPURegisters *) +{ + uint8_t Data = inb(0x60); + (void)Data; + VMwareCommand cmd; + cmd.bx = 0; + cmd.command = CMD_ABSPOINTER_STATUS; + CommandSend(&cmd); + + if (cmd.ax == 0xFFFF0000) + { + print("VMware mouse is not connected?"); + Relative(); + Absolute(); + return ERROR; + } + if ((cmd.ax & 0xFFFF) < 4) + return ERROR; + + cmd.bx = 4; + cmd.command = CMD_ABSPOINTER_DATA; + CommandSend(&cmd); + + int flags = (cmd.ax & 0xFFFF0000) >> 16; /* Not important */ + (void)flags; + MouseButton = (cmd.ax & 0xFFFF); /* 0x10 = Right, 0x20 = Left, 0x08 = Middle */ + MouseX = cmd.bx; /* Both X and Y are scaled from 0 to 0xFFFF */ + MouseY = cmd.cx; /* You should map these somewhere to the actual resolution. */ + MouseZ = (int8_t)cmd.dx; /* Z is a single signed byte indicating scroll direction. */ + return OK; +} diff --git a/Input/VirtualBoxMouse/VirtualBoxMouseDriver.cpp b/Input/VirtualBoxMouse/VirtualBoxMouseDriver.cpp index 7e8df3bb..b795dcf4 100644 --- a/Input/VirtualBoxMouse/VirtualBoxMouseDriver.cpp +++ b/Input/VirtualBoxMouse/VirtualBoxMouseDriver.cpp @@ -6,6 +6,7 @@ extern "C" int DriverEntry(void *Data); int CallbackHandler(KernelCallback *Data); +int InterruptCallback(CPURegisters *Registers); HEAD(FexFormatType_Driver, FexOSType_Fennix, DriverEntry); @@ -18,6 +19,7 @@ __attribute__((section(".extended"))) FexExtended ExtendedHeader = { .TypeFlags = FexDriverInputTypes_Mouse, .OverrideOnConflict = true, .Callback = CallbackHandler, + .InterruptCallback = InterruptCallback, .Bind = { .Type = BIND_PCI, .PCI = { @@ -78,11 +80,6 @@ int CallbackHandler(KernelCallback *Data) { break; } - case InterruptReason: - { - break; - } - default: { break; @@ -90,3 +87,8 @@ int CallbackHandler(KernelCallback *Data) } return OK; } + +int InterruptCallback(CPURegisters *) +{ + return OK; +} diff --git a/Network/AMDPCNET/pcnet.cpp b/Network/AMDPCNET/pcnet.cpp index e0e4d882..43e7eb05 100644 --- a/Network/AMDPCNET/pcnet.cpp +++ b/Network/AMDPCNET/pcnet.cpp @@ -7,6 +7,7 @@ extern "C" int DriverEntry(void *Data); int CallbackHandler(KernelCallback *Data); +int InterruptCallback(CPURegisters *Registers); HEAD(FexFormatType_Driver, FexOSType_Fennix, DriverEntry); @@ -17,6 +18,7 @@ __attribute__((section(".extended"))) FexExtended ExtendedHeader = { .Name = "AMD PCNET", .Type = FexDriverType_Network, .Callback = CallbackHandler, + .InterruptCallback = InterruptCallback, .Bind = { .Type = BIND_PCI, .PCI = { @@ -114,10 +116,6 @@ int CallbackHandler(KernelCallback *Data) Data->NetworkCallback.Fetch.MAC = MAC.ToHex(); break; } - case InterruptReason: - { - break; - } case SendReason: { break; @@ -136,3 +134,8 @@ int CallbackHandler(KernelCallback *Data) } return OK; } + +int InterruptCallback(CPURegisters *) +{ + return OK; +} diff --git a/Network/IntelGigabit/IntelGigabit.cpp b/Network/IntelGigabit/IntelGigabit.cpp index 93c4bcf8..cddbad9d 100644 --- a/Network/IntelGigabit/IntelGigabit.cpp +++ b/Network/IntelGigabit/IntelGigabit.cpp @@ -7,6 +7,7 @@ extern "C" int DriverEntry(void *Data); int CallbackHandler(KernelCallback *Data); +int InterruptCallback(CPURegisters *Registers); HEAD(FexFormatType_Driver, FexOSType_Fennix, DriverEntry); @@ -17,6 +18,7 @@ __attribute__((section(".extended"))) FexExtended ExtendedHeader = { .Name = "Intel Gigabit Ethernet Controller", .Type = FexDriverType_Network, .Callback = CallbackHandler, + .InterruptCallback = InterruptCallback, .Bind = { .Type = BIND_PCI, .PCI = { @@ -469,24 +471,6 @@ int CallbackHandler(KernelCallback *Data) Data->NetworkCallback.Fetch.MAC = MAC.ToHex(); break; } - case InterruptReason: - { - WriteCMD(REG::IMASK, 0x1); - uint32_t status = ReadCMD(0xC0); - UNUSED(status); - - while ((RX[RXCurrent]->Status & 0x1)) - { - uint8_t *Data = (uint8_t *)RX[RXCurrent]->Address; - uint16_t DataLength = RX[RXCurrent]->Length; - KAPI->Command.Network.ReceivePacket(KAPI->Info.DriverUID, Data, DataLength); - RX[RXCurrent]->Status = 0; - uint16_t OldRXCurrent = RXCurrent; - RXCurrent = (RXCurrent + 1) % E1000_NUM_RX_DESC; - WriteCMD(REG::RXDESCTAIL, OldRXCurrent); - } - break; - } case SendReason: { TX[TXCurrent]->Address = (uint64_t)Data->NetworkCallback.Send.Data; @@ -532,3 +516,22 @@ int CallbackHandler(KernelCallback *Data) } return OK; } + +int InterruptCallback(CPURegisters *) +{ + WriteCMD(REG::IMASK, 0x1); + uint32_t status = ReadCMD(0xC0); + UNUSED(status); + + while ((RX[RXCurrent]->Status & 0x1)) + { + uint8_t *Data = (uint8_t *)RX[RXCurrent]->Address; + uint16_t DataLength = RX[RXCurrent]->Length; + KAPI->Command.Network.ReceivePacket(KAPI->Info.DriverUID, Data, DataLength); + RX[RXCurrent]->Status = 0; + uint16_t OldRXCurrent = RXCurrent; + RXCurrent = (RXCurrent + 1) % E1000_NUM_RX_DESC; + WriteCMD(REG::RXDESCTAIL, OldRXCurrent); + } + return OK; +} diff --git a/Network/RTL8139/rtl8139.cpp b/Network/RTL8139/rtl8139.cpp index c29cea6d..715a5cc3 100644 --- a/Network/RTL8139/rtl8139.cpp +++ b/Network/RTL8139/rtl8139.cpp @@ -7,6 +7,7 @@ extern "C" int DriverEntry(void *Data); int CallbackHandler(KernelCallback *Data); +int InterruptCallback(CPURegisters *Registers); HEAD(FexFormatType_Driver, FexOSType_Fennix, DriverEntry); @@ -17,6 +18,7 @@ __attribute__((section(".extended"))) FexExtended ExtendedHeader = { .Name = "RTL8139", .Type = FexDriverType_Network, .Callback = CallbackHandler, + .InterruptCallback = InterruptCallback, .Bind = { .Type = BIND_PCI, .PCI = { @@ -173,23 +175,6 @@ int CallbackHandler(KernelCallback *Data) Data->NetworkCallback.Fetch.MAC = MAC.ToHex(); break; } - case InterruptReason: - { - uint16_t Status = RTLIW(0x3E); - UNUSED(Status); - - uint16_t *Data = (uint16_t *)(RXBuffer + CurrentPacket); - uint16_t DataLength = *(Data + 1); - Data = Data + 2; - KAPI->Command.Network.ReceivePacket(KAPI->Info.DriverUID, (uint8_t *)Data, DataLength); - CurrentPacket = (CurrentPacket + DataLength + 4 + 3) & (~3); - if (CurrentPacket > 8192) - CurrentPacket -= 8192; - RTLOW(0x38, CurrentPacket - 0x10); - - RTLOW(0x3E, (1 << 0) | (1 << 2)); - break; - } case SendReason: { RTLOL(TSAD[TXCurrent], static_cast(reinterpret_cast(Data->NetworkCallback.Send.Data))); @@ -212,3 +197,21 @@ int CallbackHandler(KernelCallback *Data) } return OK; } + +int InterruptCallback(CPURegisters *) +{ + uint16_t Status = RTLIW(0x3E); + UNUSED(Status); + + uint16_t *Data = (uint16_t *)(RXBuffer + CurrentPacket); + uint16_t DataLength = *(Data + 1); + Data = Data + 2; + KAPI->Command.Network.ReceivePacket(KAPI->Info.DriverUID, (uint8_t *)Data, DataLength); + CurrentPacket = (CurrentPacket + DataLength + 4 + 3) & (~3); + if (CurrentPacket > 8192) + CurrentPacket -= 8192; + RTLOW(0x38, CurrentPacket - 0x10); + + RTLOW(0x3E, (1 << 0) | (1 << 2)); + return OK; +} diff --git a/Network/RTL8169/rtl8169.cpp b/Network/RTL8169/rtl8169.cpp index d09bc0e2..5bfbb4b8 100644 --- a/Network/RTL8169/rtl8169.cpp +++ b/Network/RTL8169/rtl8169.cpp @@ -7,6 +7,7 @@ extern "C" int DriverEntry(void *Data); int CallbackHandler(KernelCallback *Data); +int InterruptCallback(CPURegisters *Registers); HEAD(FexFormatType_Driver, FexOSType_Fennix, DriverEntry); @@ -17,6 +18,7 @@ __attribute__((section(".extended"))) FexExtended ExtendedHeader = { .Name = "RTL8169", .Type = FexDriverType_Network, .Callback = CallbackHandler, + .InterruptCallback = InterruptCallback, .Bind = { .Type = BIND_PCI, .PCI = { @@ -84,10 +86,6 @@ int CallbackHandler(KernelCallback *Data) Data->NetworkCallback.Fetch.MAC = MAC.ToHex(); break; } - case InterruptReason: - { - break; - } case SendReason: { break; @@ -106,3 +104,8 @@ int CallbackHandler(KernelCallback *Data) } return OK; } + +int InterruptCallback(CPURegisters *) +{ + return OK; +} diff --git a/Network/Virtio/Virtio.cpp b/Network/Virtio/Virtio.cpp index 3aceb015..1eeae411 100644 --- a/Network/Virtio/Virtio.cpp +++ b/Network/Virtio/Virtio.cpp @@ -7,6 +7,7 @@ extern "C" int DriverEntry(void *Data); int CallbackHandler(KernelCallback *Data); +int InterruptCallback(CPURegisters *Registers); HEAD(FexFormatType_Driver, FexOSType_Fennix, DriverEntry); @@ -17,6 +18,7 @@ __attribute__((section(".extended"))) FexExtended ExtendedHeader = { .Name = "Virtio Network", .Type = FexDriverType_Network, .Callback = CallbackHandler, + .InterruptCallback = InterruptCallback, .Bind = { .Type = BIND_PCI, .PCI = { @@ -84,10 +86,6 @@ int CallbackHandler(KernelCallback *Data) Data->NetworkCallback.Fetch.MAC = MAC.ToHex(); break; } - case InterruptReason: - { - break; - } case SendReason: { break; @@ -106,3 +104,8 @@ int CallbackHandler(KernelCallback *Data) } return OK; } + +int InterruptCallback(CPURegisters *) +{ + return OK; +} diff --git a/Storage/AHCI/AHCI.cpp b/Storage/AHCI/AHCI.cpp index 265b0023..d2c666d7 100644 --- a/Storage/AHCI/AHCI.cpp +++ b/Storage/AHCI/AHCI.cpp @@ -7,6 +7,7 @@ extern "C" int DriverEntry(void *Data); int CallbackHandler(KernelCallback *Data); +int InterruptCallback(CPURegisters *Registers); HEAD(FexFormatType_Driver, FexOSType_Fennix, DriverEntry); @@ -17,6 +18,7 @@ __attribute__((section(".extended"))) FexExtended ExtendedHeader = { .Name = "AHCI", .Type = FexDriverType_Storage, .Callback = CallbackHandler, + .InterruptCallback = InterruptCallback, .Bind = { .Type = BIND_PCI, .PCI = { @@ -500,3 +502,9 @@ int CallbackHandler(KernelCallback *Data) } return OK; } + +int InterruptCallback(CPURegisters *) +{ + /* There's no need to do anything here. */ + return OK; +} diff --git a/Storage/ATA/ATA.cpp b/Storage/ATA/ATA.cpp index b11e3c97..2239cfdc 100644 --- a/Storage/ATA/ATA.cpp +++ b/Storage/ATA/ATA.cpp @@ -7,6 +7,7 @@ extern "C" int DriverEntry(void *Data); int CallbackHandler(KernelCallback *Data); +int InterruptCallback(CPURegisters *Registers); HEAD(FexFormatType_Driver, FexOSType_Fennix, DriverEntry); @@ -17,10 +18,11 @@ __attribute__((section(".extended"))) FexExtended ExtendedHeader = { .Name = "ATA", .Type = FexDriverType_Storage, .Callback = CallbackHandler, + .InterruptCallback = InterruptCallback, .Bind = { .Type = BIND_INTERRUPT, .Interrupt = { - .Vector = {0xE, 0xF}, // IRQ14, IRQ15 + .Vector = {14, 15}, // IRQ14, IRQ15 }}}}; KernelAPI *KAPI; @@ -57,18 +59,6 @@ int CallbackHandler(KernelCallback *Data) { break; } - case InterruptReason: - { - if (Data->InterruptInfo.Vector == 0xE) - { - print("IRQ14"); - } - else if (Data->InterruptInfo.Vector == 0xF) - { - print("IRQ15"); - } - break; - } case SendReason: case ReceiveReason: { @@ -88,3 +78,16 @@ int CallbackHandler(KernelCallback *Data) } return OK; } + +int InterruptCallback(CPURegisters *Registers) +{ + if (Registers->InterruptNumber == 0xE) + { + print("IRQ14"); + } + else if (Registers->InterruptNumber == 0xF) + { + print("IRQ15"); + } + return OK; +}