summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Baumann <mail@andreasbaumann.cc>2017-07-27 21:41:59 +0200
committerAndreas Baumann <mail@andreasbaumann.cc>2017-07-27 21:41:59 +0200
commit40a9f29c441cbae2d574c075579c811d07e892e7 (patch)
tree1b3fa4001373e21045cc2ba2c832928fb15dd60d
parentcd6198fbaf5d167031682681690477db67c0f211 (diff)
downloadabaos-40a9f29c441cbae2d574c075579c811d07e892e7.tar.gz
abaos-40a9f29c441cbae2d574c075579c811d07e892e7.tar.bz2
work on rtl8139 driver, can trigger interrupts now
-rw-r--r--src/drivers/net/rtl8139.c23
-rw-r--r--src/drivers/net/rtl8139.h2
-rw-r--r--src/hardware/interrupts.asm2
-rw-r--r--src/hardware/interrupts.c10
-rw-r--r--src/hardware/interrupts.h2
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( );