From c6621ef0ddd7a7ffd60f05744c85b277e530c072 Mon Sep 17 00:00:00 2001 From: Andreas Baumann Date: Sun, 23 Jul 2017 15:40:57 +0200 Subject: reading and printing MAC address int RTL8139 driver --- src/drivers/net/network.c | 10 ++++++++++ src/drivers/net/network.h | 10 ++++++++++ src/drivers/net/rtl8139.c | 32 +++++++++++++++++++++++++------- src/drivers/net/rtl8139.h | 6 ++++-- 4 files changed, 49 insertions(+), 9 deletions(-) diff --git a/src/drivers/net/network.c b/src/drivers/net/network.c index 4cc40ac..fe7ecc1 100644 --- a/src/drivers/net/network.c +++ b/src/drivers/net/network.c @@ -42,3 +42,13 @@ void network_print_info( void *obj ) { kernel_panic( "Calling abstract method in file %s at line %d.", __FILE__, __LINE__ ); } + +char *network_mac_to_string( network_mac_address_t mac, char *buf, size_t buflen ) +{ + snprintf( buf, buflen, "%X:%X:%X:%X:%X:%X", + mac.byte[0], mac.byte[1], mac.byte[2], + mac.byte[3], mac.byte[4], mac.byte[5] ); + + return buf; +} + diff --git a/src/drivers/net/network.h b/src/drivers/net/network.h index 524bb05..0621ebf 100644 --- a/src/drivers/net/network.h +++ b/src/drivers/net/network.h @@ -3,8 +3,16 @@ #include "driver.h" +#include "stdint.h" +#include "stddef.h" + +typedef struct { + uint8_t byte[6]; +} network_mac_address_t; + typedef struct { driver_t base; + network_mac_address_t mac_address; } network_t; typedef struct { @@ -17,4 +25,6 @@ void network_deactivate( void *obj ); void network_deinit( void *obj ); void network_print_info( void *obj ); +char *network_mac_to_string( network_mac_address_t mac, char *buf, size_t buflen ); + #endif // NETWORK_H diff --git a/src/drivers/net/rtl8139.c b/src/drivers/net/rtl8139.c index f895ff8..ad9370a 100644 --- a/src/drivers/net/rtl8139.c +++ b/src/drivers/net/rtl8139.c @@ -23,8 +23,12 @@ static rtl8139_vtable_t const rtl8139_vtable = { } }; -#define REG_MAC0 0 -#define REG_MAC4 4 +// registers +#define REG_MAC0 0x00 +#define REG_CMD 0x37 + +// commands for REG_CMD register +#define CR_RESET 0x08 void rtl8139_init( rtl8139_t *rtl8139, pci_device_descriptor_t *descriptor, interrupt_t *interrupt, void *context ) { @@ -33,14 +37,28 @@ void rtl8139_init( rtl8139_t *rtl8139, pci_device_descriptor_t *descriptor, inte network_init( (network_t *)rtl8139, interrupt, context ); puts( "Initializing driver for Realtek 8139 network card.." ); + + for( int i = 0; i < NOF_MAC_REGISTERS; i++ ) { + port8_init( &rtl8139->MAC_port[i], descriptor->port_base + REG_MAC0 + i ); + } + port8_init( &rtl8139->CMD_port, descriptor->port_base + REG_CMD ); + + // software reset + port8_write( &rtl8139->CMD_port, CR_RESET ); + + // get MAC + for( int i = 0; i < NOF_MAC_REGISTERS; i++ ) { + rtl8139->base.mac_address.byte[i] = port8_read( &rtl8139->MAC_port[i] ); + } + #ifdef DEBUG - printf( "using I/O base 0x%X\n", descriptor->port_base ); - printf( "using interrupt %d\n", descriptor->interrupt ); + char buf[20]; + network_mac_to_string( rtl8139->base.mac_address, buf, 20 ); + printf( "rtl8139 NIC at I/O base 0x%X, interrupt 0x%X, MAC: %s\n", + descriptor->port_base, descriptor->interrupt, buf + ); #endif - port32_init( &rtl8139->MAC0_port, descriptor->port_base + REG_MAC0 ); - port16_init( &rtl8139->MAC4_port, descriptor->port_base + REG_MAC4 ); - 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 ce59cb1..d97d3cf 100644 --- a/src/drivers/net/rtl8139.h +++ b/src/drivers/net/rtl8139.h @@ -5,10 +5,12 @@ #include "pci.h" #include "port.h" +#define NOF_MAC_REGISTERS 6 + typedef struct { network_t base; - port32_t MAC0_port; - port16_t MAC4_port; + port8_t MAC_port[NOF_MAC_REGISTERS]; + port8_t CMD_port; interrupt_handler_t interrupt_handler; } rtl8139_t; -- cgit v1.2.3-54-g00ecf