From b15512d8dad77caefe3ebe43df690ad282fdeca9 Mon Sep 17 00:00:00 2001 From: Andreas Baumann Date: Sun, 23 Jul 2017 21:56:18 +0200 Subject: printing vendor id of rtl8139 driver, started to set configuration --- src/drivers/net/rtl8139.c | 125 +++++++++++++++++++++++++++++++++++++++++++--- src/drivers/net/rtl8139.h | 3 ++ 2 files changed, 122 insertions(+), 6 deletions(-) diff --git a/src/drivers/net/rtl8139.c b/src/drivers/net/rtl8139.c index ad9370a..bc48df8 100644 --- a/src/drivers/net/rtl8139.c +++ b/src/drivers/net/rtl8139.c @@ -26,9 +26,46 @@ static rtl8139_vtable_t const rtl8139_vtable = { // registers #define REG_MAC0 0x00 #define REG_CMD 0x37 +#define REG_TCR 0x40 +#define REG_RCR 0x44 // commands for REG_CMD register -#define CR_RESET 0x08 +#define CMD_RESET 0x10 +#define CMD_RECEIVER_ENABLE 0x08 +#define CMD_TRANSMITTER_ENABLE 0x04 + +#define TCR_HWVER_AM 0x7C000000 +#define TCR_HWVER_BM 0x00C00000 + +#define TCR_HWVER_RTL8139 0x60000000 +#define TCR_HWVER_RTL8139A 0x70000000 +/* +#define TCR_HWVER_RTL8139AG 0x74000000 +#define TCR_HWVER_RTL8139B 0x78000000 +#define TCR_HWVER_RTL8130 0x78000000 +#define TCR_HWVER_RTL8139C 0x74000000 +#define TCR_HWVER_RTL8100 0x78800000 +#define TCR_HWVER_RTL8100B 0x74400000 +*/ +#define TCR_HWVER_RTL8139CP 0x74800000 +#define TCR_HWVER_RTL8101 0x74C00000 +// 01111100 11000000 00000000 00000000 + +#define TCR_IFG_STANDARD 0x03000000 + +/* +#define TCR_IFG_STANDARD (3 << 24) +#define TCR_MXDMA_512 (5 << 8) +#define TCR_MXDMA_1024 (6 << 8) +#define TCR_MXDMA_2048 (7 << 8) + +#define RCR_MXDMA_512 (5 << 8) +#define RCR_MXDMA_1024 (6 << 8) +#define RCR_MXDMA_UNLIMITED (7 << 8) +#define RCR_ACCEPT_BROADCAST (1 << 3) +#define RCR_ACCEPT_MULTICAST (1 << 2) +#define RCR_ACCEPT_PHYS_MATCH (1 << 1) +*/ void rtl8139_init( rtl8139_t *rtl8139, pci_device_descriptor_t *descriptor, interrupt_t *interrupt, void *context ) { @@ -42,21 +79,97 @@ void rtl8139_init( rtl8139_t *rtl8139, pci_device_descriptor_t *descriptor, inte port8_init( &rtl8139->MAC_port[i], descriptor->port_base + REG_MAC0 + i ); } port8_init( &rtl8139->CMD_port, descriptor->port_base + REG_CMD ); + port32_init( &rtl8139->TCR_port, descriptor->port_base + REG_TCR ); + port32_init( &rtl8139->RCR_port, descriptor->port_base + REG_RCR ); - // software reset - port8_write( &rtl8139->CMD_port, CR_RESET ); + // software reset, the CR_RESET bit remains high till the + // reset is finished + port8_write( &rtl8139->CMD_port, CMD_RESET ); + while( ( port8_read( &rtl8139->CMD_port ) & CMD_RESET ) == CMD_RESET ); // get MAC for( int i = 0; i < NOF_MAC_REGISTERS; i++ ) { rtl8139->base.mac_address.byte[i] = port8_read( &rtl8139->MAC_port[i] ); } + // enable receiver and transmitter early + port8_write( &rtl8139->CMD_port, CMD_RECEIVER_ENABLE | CMD_TRANSMITTER_ENABLE ); + + // get model + uint32_t model_id = port32_read( &rtl8139->TCR_port ) & ( TCR_HWVER_AM | TCR_HWVER_BM ); + switch( model_id ) { + + case TCR_HWVER_RTL8139: + rtl8139->model = "RTL8139"; + break; + + case TCR_HWVER_RTL8139A: + rtl8139->model = "RTL8139A"; + break; + +/* + case TCR_HWVER_RTL8139AG: + rtl8139->model = "RTL8139A-G"; + break; + + case TCR_HWVER_RTL8139B: + rtl8139->model = "RTL8139B"; + break; + + case TCR_HWVER_RTL8130: + rtl8139->model = "RTL8130"; + break; + + case TCR_HWVER_RTL8139C: + rtl8139->model = "RTL8139C"; + break; + + case TCR_HWVER_RTL8100: + rtl8139->model = "RTL8100"; + break; + + case TCR_HWVER_RTL8100B: + rtl8139->model = "RTL8100B"; + break; +*/ + case TCR_HWVER_RTL8139CP: + rtl8139->model = "RTL8139C+"; + break; + + case TCR_HWVER_RTL8101: + rtl8139->model = "RTL8101"; + break; + + default: + rtl8139->model = NULL; + break; + } + +/* TODO: + port32_write( &rtl8139->TCR_port, TCR_IFG_STANDARD ); + + port32_write( &rtl8139->RCR_port, ); + + TCR RCR + + DEBUG_MSG("Inititalisiere RCR/TCR"); + write_register_dword(netcard, REG_RECEIVE_CONFIGURATION, + RCR_MXDMA_UNLIMITED | RCR_ACCEPT_BROADCAST | RCR_ACCEPT_PHYS_MATCH); + + // DMA burst, 2k is max, what are other operating systems doing? + write_register_dword(netcard, REG_TRANSMIT_CONFIGURATION, + TCR_IFG_STANDARD | TCR_MXDMA_2048); + +*/ + #ifdef DEBUG char buf[20]; + char buf2[30]; + snprintf( buf2, 30, "unknown submodel 0x%X", model_id ); 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 - ); + printf( "rtl8139 NIC type %s\n at I/O base 0x%X, interrupt 0x%X, MAC: %s\n", + ( rtl8139->model != NULL ) ? rtl8139->model : buf2, + descriptor->port_base, descriptor->interrupt, buf ); #endif interrupt_handler_init( &rtl8139->interrupt_handler, IRQ_BASE + descriptor->interrupt, interrupt, rtl8139_handle_interrupt, rtl8139 ); diff --git a/src/drivers/net/rtl8139.h b/src/drivers/net/rtl8139.h index d97d3cf..034b85b 100644 --- a/src/drivers/net/rtl8139.h +++ b/src/drivers/net/rtl8139.h @@ -11,6 +11,9 @@ typedef struct { network_t base; port8_t MAC_port[NOF_MAC_REGISTERS]; port8_t CMD_port; + port32_t TCR_port; + port32_t RCR_port; + const char *model; interrupt_handler_t interrupt_handler; } rtl8139_t; -- cgit v1.2.3-54-g00ecf