summaryrefslogtreecommitdiff
path: root/src/drivers/net/rtl8139.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/drivers/net/rtl8139.c')
-rw-r--r--src/drivers/net/rtl8139.c39
1 files changed, 37 insertions, 2 deletions
diff --git a/src/drivers/net/rtl8139.c b/src/drivers/net/rtl8139.c
index 4ae61e3..f895ff8 100644
--- a/src/drivers/net/rtl8139.c
+++ b/src/drivers/net/rtl8139.c
@@ -3,7 +3,16 @@
#include "string.h"
#include "stdio.h"
-#undef DEBUG
+#define DEBUG
+
+/*
+Offset (from IO base) Size Name
+0x08 8 MAR0-7
+0x30 4 RBSTART
+0x37 1 CMD
+0x3C 2 IMR
+0x3E 2 ISR
+*/
static rtl8139_vtable_t const rtl8139_vtable = {
{
@@ -14,12 +23,27 @@ static rtl8139_vtable_t const rtl8139_vtable = {
}
};
-void rtl8139_init( rtl8139_t *rtl8139, interrupt_t *interrupt, void *context )
+#define REG_MAC0 0
+#define REG_MAC4 4
+
+void rtl8139_init( rtl8139_t *rtl8139, pci_device_descriptor_t *descriptor, interrupt_t *interrupt, void *context )
{
memset( rtl8139, 0, sizeof( rtl8139_t ) );
network_init( (network_t *)rtl8139, interrupt, context );
+ puts( "Initializing driver for Realtek 8139 network card.." );
+#ifdef DEBUG
+ printf( "using I/O base 0x%X\n", descriptor->port_base );
+ printf( "using interrupt %d\n", descriptor->interrupt );
+#endif
+
+ port32_init( &rtl8139->MAC0_port, descriptor->port_base + REG_MAC0 );
+ port16_init( &rtl8139->MAC4_port, descriptor->port_base + REG_MAC4 );
+
+ interrupt_handler_init( &rtl8139->interrupt_handler, IRQ_BASE + descriptor->interrupt, interrupt, rtl8139_handle_interrupt, rtl8139 );
+ interrupts_register_interrupt_handler( rtl8139->interrupt_handler );
+
((driver_t *)rtl8139)->vtable = (driver_vtable_t *)&rtl8139_vtable;
}
@@ -42,6 +66,17 @@ void rtl8139_deinit( void *obj )
// nothing to do
}
+uint32_t rtl8139_handle_interrupt( interrupt_handler_t *handler, uint32_t esp )
+{
+ rtl8139_t *rtl8139 = (rtl8139_t *)handler->driver;
+
+#ifdef DEBUG
+ printf( "RTL INTERRUPT\n" );
+#endif
+
+ return esp;
+}
+
void rtl8139_print_info( void *obj )
{
puts( "Realtek 8139 network card driver" );