From cb2acdaf3d1ee158f41a7e2617ebaaadfeef53da Mon Sep 17 00:00:00 2001 From: Andreas Baumann Date: Sun, 6 Aug 2017 21:41:16 +0200 Subject: some cleanup in ethernet constants sending back an ARP packet rtl8139: started to implement write (work in progress) --- src/drivers/net/rtl8139.c | 38 ++++++++++++++++++++++++++++++++------ 1 file changed, 32 insertions(+), 6 deletions(-) (limited to 'src/drivers/net/rtl8139.c') 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 +} -- cgit v1.2.3-54-g00ecf