diff options
author | Anton Kling <anton@kling.gg> | 2024-06-22 14:34:21 +0200 |
---|---|---|
committer | Anton Kling <anton@kling.gg> | 2024-06-22 14:34:21 +0200 |
commit | 01b88a7bf9fb4c78bd632bfccb06f3d320a21fd5 (patch) | |
tree | 20d9a6dcc155e7c8b6e067c6ba6d7b42df4365fd /kernel/drivers/rtl8139.c | |
parent | af313dec6b7698b6f948b97669aa7be91717a451 (diff) |
Kernel stuff
Diffstat (limited to 'kernel/drivers/rtl8139.c')
-rw-r--r-- | kernel/drivers/rtl8139.c | 19 |
1 files changed, 6 insertions, 13 deletions
diff --git a/kernel/drivers/rtl8139.c b/kernel/drivers/rtl8139.c index c0aa0b2..74d7c05 100644 --- a/kernel/drivers/rtl8139.c +++ b/kernel/drivers/rtl8139.c @@ -3,6 +3,7 @@ #include <cpu/io.h> #include <drivers/pci.h> #include <drivers/rtl8139.h> +#include <interrupts.h> #include <mmu.h> #include <network/arp.h> #include <network/ethernet.h> @@ -47,18 +48,18 @@ u32 current_packet_read = 0; void handle_packet(void) { assert(sizeof(struct _INT_PACKET_HEADER) == sizeof(u16)); - for (int i = 0; 0 == (inb(rtl8139.gen.base_mem_io + 0x37) & 1); i++) { + for (; 0 == (inb(rtl8139.gen.base_mem_io + 0x37) & 1);) { u16 *buf = (u16 *)(device_buffer + current_packet_read); struct PACKET_HEADER packet_header; packet_header.raw = *buf; if (packet_header.data.FAE) { - return; + break; } if (packet_header.data.CRC) { - return; + break; } if (!packet_header.data.ROK) { - return; + break; } u16 packet_length = *(buf + 1); assert(packet_length <= 2048); @@ -90,6 +91,7 @@ void handle_packet(void) { } void rtl8139_handler(void *regs) { + disable_interrupts(); (void)regs; u16 status = inw(rtl8139.gen.base_mem_io + 0x3e); @@ -110,16 +112,7 @@ void rtl8139_send_data(u8 *data, u16 data_size) { data_size -= 0x1000; return rtl8139_send_data(data, data_size); } - // ipc_write(0, data, data_size); const struct PCI_DEVICE *device = &rtl8139; - // FIXME: It should block or fail if there is too little space for the - // buffer - if (data_size > 0x1000) { - rtl8139_send_data(data, 0x1000); - data += 0x1000; - data_size -= 0x1000; - return rtl8139_send_data(data, data_size); - } if (send_buffers_loop > 3) { send_buffers_loop = 0; } |