summaryrefslogtreecommitdiff
path: root/kernel/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/drivers')
-rw-r--r--kernel/drivers/rtl8139.c18
-rw-r--r--kernel/drivers/rtl8139.h2
2 files changed, 20 insertions, 0 deletions
diff --git a/kernel/drivers/rtl8139.c b/kernel/drivers/rtl8139.c
index 669cb6c..946c405 100644
--- a/kernel/drivers/rtl8139.c
+++ b/kernel/drivers/rtl8139.c
@@ -111,6 +111,24 @@ void rtl8139_handler(void *regs) {
EOI(0xB);
}
+u8 *nic_get_buffer(void) {
+ if (send_buffers_loop > 3) {
+ send_buffers_loop = 0;
+ }
+ return send_buffers[send_buffers_loop];
+}
+
+void nic_send_buffer(u16 data_size) {
+ const struct PCI_DEVICE *device = &rtl8139;
+ outl(device->gen.base_mem_io + 0x20 + send_buffers_loop * 4,
+ (u32)virtual_to_physical(send_buffers[send_buffers_loop], NULL));
+ outl(device->gen.base_mem_io + 0x10 + send_buffers_loop * 4, data_size);
+ send_buffers_loop += 1;
+ if (send_buffers_loop > 3) {
+ send_buffers_loop = 0;
+ }
+}
+
void rtl8139_send_data(u8 *data, u16 data_size) {
if (data_size > 0x1000) {
rtl8139_send_data(data, 0x1000);
diff --git a/kernel/drivers/rtl8139.h b/kernel/drivers/rtl8139.h
index c61e6de..ebefd77 100644
--- a/kernel/drivers/rtl8139.h
+++ b/kernel/drivers/rtl8139.h
@@ -2,3 +2,5 @@
void get_mac_address(u8 mac[6]);
void rtl8139_init(void);
void rtl8139_send_data(u8 *data, u16 data_size);
+u8 *nic_get_buffer(void);
+void nic_send_buffer(u16 data_size);