summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Baumann <mail@andreasbaumann.cc>2017-07-23 15:40:57 +0200
committerAndreas Baumann <mail@andreasbaumann.cc>2017-07-23 15:40:57 +0200
commitc6621ef0ddd7a7ffd60f05744c85b277e530c072 (patch)
tree97dbde1201b9b472d586966b3de126de5b7b30ff
parentec9ed8deb79a9fd508a11b122453bb39d3b587a9 (diff)
downloadabaos-c6621ef0ddd7a7ffd60f05744c85b277e530c072.tar.gz
abaos-c6621ef0ddd7a7ffd60f05744c85b277e530c072.tar.bz2
reading and printing MAC address int RTL8139 driver
-rw-r--r--src/drivers/net/network.c10
-rw-r--r--src/drivers/net/network.h10
-rw-r--r--src/drivers/net/rtl8139.c32
-rw-r--r--src/drivers/net/rtl8139.h6
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;