From 40a9f29c441cbae2d574c075579c811d07e892e7 Mon Sep 17 00:00:00 2001 From: Andreas Baumann Date: Thu, 27 Jul 2017 21:41:59 +0200 Subject: work on rtl8139 driver, can trigger interrupts now --- src/drivers/net/rtl8139.c | 23 +++++++++++++---------- src/drivers/net/rtl8139.h | 2 ++ src/hardware/interrupts.asm | 2 ++ src/hardware/interrupts.c | 10 +++++++++- src/hardware/interrupts.h | 2 ++ 5 files changed, 28 insertions(+), 11 deletions(-) diff --git a/src/drivers/net/rtl8139.c b/src/drivers/net/rtl8139.c index a24afbe..78a552a 100644 --- a/src/drivers/net/rtl8139.c +++ b/src/drivers/net/rtl8139.c @@ -2,18 +2,10 @@ #include "string.h" #include "stdio.h" +#include "stdlib.h" #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 = { { rtl8139_activate, @@ -26,6 +18,7 @@ static rtl8139_vtable_t const rtl8139_vtable = { // registers #define REG_MAC0 0x00 +#define REG_RBSTART 0x30 #define REG_CMD 0x37 #define REG_IMR 0x3C #define REG_ISR 0x3E @@ -80,6 +73,9 @@ static rtl8139_vtable_t const rtl8139_vtable = { ISR_RECEIVE_BUFFER_OVERFLOW | ISR_TRANSMIT_ERROR | ISR_TRANSMIT_OK | \ ISR_RECEIVE_ERROR | ISR_RECEIVE_OK +// for now we follow the guide line on OSDEV on the size of the receive buffer +#define RECEIVE_BUFFER_SIZE 8192 + 16 + void rtl8139_init( rtl8139_t *rtl8139, pci_device_descriptor_t *descriptor, interrupt_t *interrupt, void *context ) { memset( rtl8139, 0, sizeof( rtl8139_t ) ); @@ -94,6 +90,7 @@ void rtl8139_init( rtl8139_t *rtl8139, pci_device_descriptor_t *descriptor, inte port8_init( &rtl8139->MAC_port[i], descriptor->port_base + REG_MAC0 + i ); } port8_init( &rtl8139->CMD_port, descriptor->port_base + REG_CMD ); + port32_init( &rtl8139->RBSTART_port, descriptor->port_base + REG_RBSTART ); port16_init( &rtl8139->IMR_port, descriptor->port_base + REG_IMR ); port16_init( &rtl8139->ISR_port, descriptor->port_base + REG_ISR ); port32_init( &rtl8139->TCR_port, descriptor->port_base + REG_TCR ); @@ -159,6 +156,10 @@ void rtl8139_init( rtl8139_t *rtl8139, pci_device_descriptor_t *descriptor, inte port32_write( &rtl8139->TCR_port, TCR_IFG_STANDARD | TCR_MXDMA_2048 ); port32_write( &rtl8139->RCR_port, RCR_MXDMA_UNLIMITED | RCR_ACCEPT_BROADCAST | RCR_ACCEPT_PHYS_MATCH ); + // allocate receive buffer and register it + rtl8139->receive_buffer = (uint8_t *)malloc( RECEIVE_BUFFER_SIZE ); + port32_write( &rtl8139->RBSTART_port, (uint32_t)rtl8139->receive_buffer ); + // register interrupts we are interested in (we want all and // filter them in the interrupt handler), read ISR to clear // the current values (if there are bits set) @@ -189,7 +190,9 @@ void rtl8139_deactivate( void *obj ) void rtl8139_deinit( void *obj ) { - // nothing to do + rtl8139_t *rtl8139 = (rtl8139_t *)obj; + + free( rtl8139->receive_buffer ); } uint32_t rtl8139_handle_interrupt( interrupt_handler_t *handler, uint32_t esp ) diff --git a/src/drivers/net/rtl8139.h b/src/drivers/net/rtl8139.h index 66c9a22..91a7495 100644 --- a/src/drivers/net/rtl8139.h +++ b/src/drivers/net/rtl8139.h @@ -10,6 +10,7 @@ typedef struct { network_t base; port8_t MAC_port[NOF_MAC_REGISTERS]; + port32_t RBSTART_port; port8_t CMD_port; port16_t IMR_port; port16_t ISR_port; @@ -18,6 +19,7 @@ typedef struct { pci_device_descriptor_t pci_descriptor; uint32_t model_id; const char *model; + uint8_t *receive_buffer; interrupt_handler_t interrupt_handler; } rtl8139_t; diff --git a/src/hardware/interrupts.asm b/src/hardware/interrupts.asm index 95d33f9..a734898 100644 --- a/src/hardware/interrupts.asm +++ b/src/hardware/interrupts.asm @@ -60,6 +60,8 @@ interrupts_handle_irq_%1: irq_stub 0x00 irq_stub 0x01 +irq_stub 0x09 +irq_stub 0x0A irq_stub 0x0B irq_stub 0x0C diff --git a/src/hardware/interrupts.c b/src/hardware/interrupts.c index 41433a5..faca1fd 100644 --- a/src/hardware/interrupts.c +++ b/src/hardware/interrupts.c @@ -109,7 +109,15 @@ void interrupts_init( interrupt_t *interrupt, uint16_t gdt_code_segment_selector interrupts_register_interrupt_gate( interrupt, IRQ_BASE + 0x01, gdt_code_segment_selector, &interrupts_handle_irq_0x01, KERNEL_RING, IDT_TYPE_INTERRUPT_GATE ); - // IRQ 11 - PCI, at the moment the RTL8139 + // IRQ 9 - PCI peripheral + interrupts_register_interrupt_gate( interrupt, IRQ_BASE + 0x09, gdt_code_segment_selector, + &interrupts_handle_irq_0x09, KERNEL_RING, IDT_TYPE_INTERRUPT_GATE ); + + // IRQ 10 - PCI peripheral + interrupts_register_interrupt_gate( interrupt, IRQ_BASE + 0x0A, gdt_code_segment_selector, + &interrupts_handle_irq_0x0A, KERNEL_RING, IDT_TYPE_INTERRUPT_GATE ); + + // IRQ 11 - PCI peripheral interrupts_register_interrupt_gate( interrupt, IRQ_BASE + 0x0B, gdt_code_segment_selector, &interrupts_handle_irq_0x0B, KERNEL_RING, IDT_TYPE_INTERRUPT_GATE ); diff --git a/src/hardware/interrupts.h b/src/hardware/interrupts.h index f93fa44..66f5d8e 100644 --- a/src/hardware/interrupts.h +++ b/src/hardware/interrupts.h @@ -103,6 +103,8 @@ void interrupts_ignore_request( ); void interrupts_handle_exception_0x00( ); void interrupts_handle_irq_0x00( ); void interrupts_handle_irq_0x01( ); +void interrupts_handle_irq_0x09( ); +void interrupts_handle_irq_0x0A( ); void interrupts_handle_irq_0x0B( ); void interrupts_handle_irq_0x0C( ); -- cgit v1.2.3-54-g00ecf