summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/drivers/net/rtl8139.c7
-rw-r--r--src/drivers/net/rtl8139.h3
2 files changed, 8 insertions, 2 deletions
diff --git a/src/drivers/net/rtl8139.c b/src/drivers/net/rtl8139.c
index e6898d4..4f32815 100644
--- a/src/drivers/net/rtl8139.c
+++ b/src/drivers/net/rtl8139.c
@@ -89,12 +89,13 @@ static rtl8139_vtable_t const rtl8139_vtable = {
// receive buffer, set to 8k + header (16) + wrap (2k)
#define RECEIVE_BUFFER_SIZE 8192 + 16 + 2048
-void rtl8139_init( rtl8139_t *rtl8139, pci_device_descriptor_t *descriptor, interrupt_t *interrupt, void *context )
+void rtl8139_init( rtl8139_t *rtl8139, pci_controller_t *pci, pci_device_descriptor_t *descriptor, interrupt_t *interrupt, void *context )
{
memset( rtl8139, 0, sizeof( rtl8139_t ) );
network_init( (network_t *)rtl8139, interrupt, context );
+ rtl8139->pci = pci;
rtl8139->pci_descriptor = *descriptor;
puts( "Initializing driver for Realtek 8139 network card.." );
@@ -184,6 +185,10 @@ void rtl8139_init( rtl8139_t *rtl8139, pci_device_descriptor_t *descriptor, inte
// reset missed packet counter
port32_write( &rtl8139->MPC_port, 0 );
+ // enable bus mastering for DMA transfers (without this the receive
+ // buffer remains empty!)
+ pci_enable_bus_mastering( rtl8139->pci, &rtl8139->pci_descriptor );
+
interrupt_handler_init( &rtl8139->interrupt_handler, IRQ_BASE + descriptor->interrupt, interrupt, rtl8139_handle_interrupt, rtl8139 );
interrupts_register_interrupt_handler( rtl8139->interrupt_handler );
diff --git a/src/drivers/net/rtl8139.h b/src/drivers/net/rtl8139.h
index 58b2167..7419f65 100644
--- a/src/drivers/net/rtl8139.h
+++ b/src/drivers/net/rtl8139.h
@@ -19,6 +19,7 @@ typedef struct {
port32_t TCR_port;
port32_t RCR_port;
port32_t MPC_port;
+ pci_controller_t *pci;
pci_device_descriptor_t pci_descriptor;
uint32_t model_id;
const char *model;
@@ -31,7 +32,7 @@ typedef struct {
network_vtable_t base;
} rtl8139_vtable_t;
-void rtl8139_init( rtl8139_t *rtl8139, pci_device_descriptor_t *descriptor, interrupt_t *interrupt, void *context );
+void rtl8139_init( rtl8139_t *rtl8139, pci_controller_t *pci, pci_device_descriptor_t *descriptor, interrupt_t *interrupt, void *context );
void rtl8139_activate( void *obj );
void rtl8139_deactivate( void *obj );
void rtl8139_deinit( void *obj );