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.c22
1 files changed, 13 insertions, 9 deletions
diff --git a/src/drivers/net/rtl8139.c b/src/drivers/net/rtl8139.c
index 7731475..3dafaef 100644
--- a/src/drivers/net/rtl8139.c
+++ b/src/drivers/net/rtl8139.c
@@ -197,6 +197,7 @@ void rtl8139_init( rtl8139_t *rtl8139, pci_controller_t *pci, pci_device_descrip
port32_write( &rtl8139->TSAD_port[i], (uint32_t)rtl8139->transmit_buffer[i] );
}
rtl8139->transmit_buffer_idx = 0;
+ rtl8139->transmitting = false;
// reset missed packet counter
port32_write( &rtl8139->MPC_port, 0 );
@@ -282,20 +283,16 @@ static void handle_receive_packet( rtl8139_t *rtl8139 )
printf( "%X ", rtl8139->receive_buffer[rtl8139->receive_buffer_pos+i] );
}
puts( "" );
- printf( "rtl8139: CRC: " );
- for( int i = len; i < len + 4; i++ ) {
- printf( "%X ", rtl8139->receive_buffer[rtl8139->receive_buffer_pos+i] );
- }
- puts( "" );
#endif
network_event_t event;
if( len >= ETHERNET_MIN_FRAME_SIZE_IEEE_802_3 ) {
+ // remove CRC (which is part of len)
// copy data for the handler of the network event
- event.buf.length = len;
- event.buf.data = (uint8_t *)malloc( len );
- memcpy( event.buf.data, buffer, len );
+ event.buf.length = len - sizeof( uint32_t );
+ event.buf.data = (uint8_t *)malloc( event.buf.length );
+ memcpy( event.buf.data, buffer, event.buf.length );
memset( rtl8139->receive_buffer, 0, len + 2 * sizeof( uint16_t ) );
} else {
// make sure we don't have a runt package
@@ -339,6 +336,8 @@ uint32_t rtl8139_handle_interrupt( interrupt_handler_t *handler, uint32_t esp )
// TODO: manual says, we should reset the ISR bit first,
// then go into a read loop?
handle_receive_packet( rtl8139 );
+ } else if( isr & ISR_TRANSMIT_OK ) {
+ rtl8139->transmitting = false;
}
// reset interrupt lines when consumed
@@ -361,7 +360,7 @@ void rtl8139_print_info( void *obj )
if( rtl8139->model == NULL ) {
snprintf( buf2, 30, "unknown submodel 0x%X", rtl8139->model_id );
}
- network_mac_address_to_string( rtl8139->base.mac_address, buf, 20 );
+ ethernet_mac_address_to_string( rtl8139->base.mac_address, buf, 20 );
printf( "rtl8139 NIC type %s\n at I/O base 0x%X, interrupt 0x%X, MAC: %s\n",
( rtl8139->model != NULL ) ? rtl8139->model : buf2,
rtl8139->pci_descriptor.port_base, rtl8139->pci_descriptor.interrupt, buf );
@@ -371,6 +370,11 @@ void rtl8139_write( void *obj, network_buffer_t buf )
{
rtl8139_t *rtl8139 = (rtl8139_t *)obj;
+ if( rtl8139->transmitting ) {
+ puts( "rtl8139: currently transmitting, buffer overrun" );
+ return;
+ }
+
#ifdef DEBUG
printf( "rtl8139: sending data of length %d\n", buf.length );
printf( "rtl8139: " );