From d4c0eb036034288bab5202a8f0c6242cb1e5325b Mon Sep 17 00:00:00 2001 From: Andreas Baumann Date: Tue, 1 Aug 2017 16:58:18 +0200 Subject: sucessfully enabled DMA transfers in RTL8139 driver --- src/drivers/net/rtl8139.c | 7 ++++++- src/drivers/net/rtl8139.h | 3 ++- 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 ); -- cgit v1.2.3-54-g00ecf