summaryrefslogtreecommitdiff
path: root/src/drivers/net/rtl8139.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/drivers/net/rtl8139.c')
-rw-r--r--src/drivers/net/rtl8139.c38
1 files changed, 32 insertions, 6 deletions
diff --git a/src/drivers/net/rtl8139.c b/src/drivers/net/rtl8139.c
index 5b95042..ad6ccfe 100644
--- a/src/drivers/net/rtl8139.c
+++ b/src/drivers/net/rtl8139.c
@@ -15,12 +15,15 @@ static rtl8139_vtable_t const rtl8139_vtable = {
rtl8139_print_name,
rtl8139_print_info
},
- network_register_handler
+ network_register_handler,
+ rtl8139_write
}
};
// registers
#define REG_MAC0 0x00
+#define REG_TR_STATUS0 0x10
+#define REG_TR_ADDR0 0x20
#define REG_RBSTART 0x30
#define REG_CMD 0x37
#define REG_CAPR 0x38
@@ -86,8 +89,6 @@ static rtl8139_vtable_t const rtl8139_vtable = {
// header
#define PACKET_HEADER_ROK 0x0001
-#define ETHERNET_MIN_FRAME_SIZE_IEEE_802_3 64
-
// receive buffer, set to 8k + header (16) + wrap (2k)
#define RECEIVE_BUFFER_SIZE 8192
#define RECEIVE_TOTAL_BUFFER_SIZE RECEIVE_BUFFER_SIZE + 16 + 2048
@@ -106,6 +107,11 @@ void rtl8139_init( rtl8139_t *rtl8139, pci_controller_t *pci, pci_device_descrip
for( int i = 0; i < NOF_MAC_REGISTERS; i++ ) {
port8_init( &rtl8139->MAC_port[i], descriptor->port_base + REG_MAC0 + i );
}
+ for( int i = 0; i < NOF_TRANSMIT_BUFFERS; i++ ) {
+ port32_init( &rtl8139->TSD_port[i], descriptor->port_base + REG_TR_STATUS0 +i );
+ port32_init( &rtl8139->TSAD_port[i], descriptor->port_base + REG_TR_ADDR0 + i );
+ }
+
port8_init( &rtl8139->CMD_port, descriptor->port_base + REG_CMD );
port16_init( &rtl8139->CAPR_port, descriptor->port_base + REG_CAPR );
port32_init( &rtl8139->RBSTART_port, descriptor->port_base + REG_RBSTART );
@@ -184,6 +190,14 @@ void rtl8139_init( rtl8139_t *rtl8139, pci_controller_t *pci, pci_device_descrip
port32_write( &rtl8139->RBSTART_port, (uint32_t)rtl8139->receive_buffer );
rtl8139->receive_buffer_pos = 0;
+ // allocate transmit buffers and set index to first transmit buffer
+ for( int i = 0; i < NOF_TRANSMIT_BUFFERS; i++ ) {
+ rtl8139->transmit_buffer[i] = (uint8_t *)aligned_alloc( 16, ETHERNET_MAX_FRAME_SIZE_IEEE_802_3 );
+ memset( rtl8139->transmit_buffer[i], 0, ETHERNET_MAX_FRAME_SIZE_IEEE_802_3 );
+ port32_write( &rtl8139->TSAD_port[i], (uint32_t)rtl8139->transmit_buffer[i] );
+ }
+ rtl8139->transmit_buffer_idx = 0;
+
// reset missed packet counter
port32_write( &rtl8139->MPC_port, 0 );
@@ -279,9 +293,9 @@ static void handle_receive_packet( rtl8139_t *rtl8139 )
if( len >= ETHERNET_MIN_FRAME_SIZE_IEEE_802_3 ) {
// copy data for the handler of the network event
- event.length = len;
- event.data = (uint8_t *)malloc( len );
- memcpy( event.data, buffer, len );
+ event.buf.length = len;
+ event.buf.data = (uint8_t *)malloc( len );
+ memcpy( event.buf.data, buffer, len );
memset( rtl8139->receive_buffer, 0, len + 2 * sizeof( uint16_t ) );
} else {
// make sure we don't have a runt package
@@ -353,3 +367,15 @@ void rtl8139_print_info( void *obj )
( rtl8139->model != NULL ) ? rtl8139->model : buf2,
rtl8139->pci_descriptor.port_base, rtl8139->pci_descriptor.interrupt, buf );
}
+
+void rtl8139_write( void *obj, network_buffer_t buf )
+{
+#ifdef DEBUG
+ printf( "rtl8139: sending data of length %d\n", buf.length );
+ printf( "rtl8139: " );
+ for( int i = 0; i < buf.length; i++ ) {
+ printf( "%X ", ((const uint8_t *)buf.data)[i] );
+ }
+ puts( "" );
+#endif
+}