summaryrefslogtreecommitdiff
path: root/src/hardware/pci.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/hardware/pci.c')
-rw-r--r--src/hardware/pci.c19
1 files changed, 13 insertions, 6 deletions
diff --git a/src/hardware/pci.c b/src/hardware/pci.c
index 6aae01e..6c43448 100644
--- a/src/hardware/pci.c
+++ b/src/hardware/pci.c
@@ -2,8 +2,10 @@
#include "string.h"
#include "stdio.h"
+#include "stdlib.h"
#include "drivers/video/vga.h"
+#include "drivers/net/rtl8139.h"
#define NOF_BUSES 8
#define NOF_DEVICES_PER_BUS 32
@@ -99,11 +101,11 @@ void pci_controller_scan_and_register( pci_controller_t *controller, driver_mana
if( bar.type == BASE_ADDRESS_REGISTER_TYPE_IO && bar.addr ) {
device_descriptor.port_base = (uint32_t)bar.addr;
}
+ }
- driver_t *driver = pci_device_get_driver( &device_descriptor, interrupt );
- if( driver ) {
- driver_manager_add_driver( driver_manager, driver );
- }
+ driver_t *driver = pci_device_get_driver( &device_descriptor, interrupt );
+ if( driver ) {
+ driver_manager_add_driver( driver_manager, driver );
}
}
}
@@ -157,11 +159,15 @@ void pci_base_address_register_init( pci_base_address_register_t *base_address_r
driver_t *pci_device_get_driver( pci_device_descriptor_t *descriptor, interrupt_t *interrupt )
{
+ driver_t *driver = NULL;
+
// find a specific device
switch( descriptor->vendor_id ) {
case 0x10ec: // Realtek Semiconductor
switch( descriptor->device_id ) {
- case 0x8029: // RTL-8029
+ case 0x8139: // RTL8139
+ driver = (driver_t *)malloc( sizeof( rtl8139_t ) );
+ rtl8139_init( (rtl8139_t *)driver );
break;
}
break;
@@ -190,5 +196,6 @@ driver_t *pci_device_get_driver( pci_device_descriptor_t *descriptor, interrupt_
default: // no driver found
break;
}
- return NULL;
+
+ return driver;
}