From d9638539eb82b74d9efc7abb0d71b2deb68a2547 Mon Sep 17 00:00:00 2001 From: Andreas Baumann Date: Thu, 10 Aug 2017 12:34:23 +0200 Subject: some renamed in ethernet/rtl8139 don't try tp play with the ethernet CRCs, they belong to layer 2 OSI, the firmware of the network card rtl8139: computing packet size correctly (sizeof uint32_t of the CRC was part of the payload len) --- src/drivers/net/rtl8139.c | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) (limited to 'src/drivers/net/rtl8139.c') 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: " ); -- cgit v1.2.3-54-g00ecf