From 6ad250bc8730dfa4f31990c300969c718530dc0f Mon Sep 17 00:00:00 2001 From: Niels Sascha Reedijk Date: Wed, 18 Jun 2003 10:45:52 +0000 Subject: [PATCH] In theory the driver should now work. though I'm not really buying it yet, I think that it shouldn't drop any packets anymore (only delay them) - I implemented a packet wrap, so after 64k the driver will start over again - I fixed a bug where packets with the largest ethernet frame size (1514) weren't accepted. git-svn-id: file:///srv/svn/repos/haiku/trunk/current@3561 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../kernel/drivers/network/rtl8139/TODO | 2 ++ .../kernel/drivers/network/rtl8139/driver.c | 24 +++++++++++++++---- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/src/add-ons/kernel/drivers/network/rtl8139/TODO b/src/add-ons/kernel/drivers/network/rtl8139/TODO index e29f59d9b5..a8a4df9c7e 100644 --- a/src/add-ons/kernel/drivers/network/rtl8139/TODO +++ b/src/add-ons/kernel/drivers/network/rtl8139/TODO @@ -2,3 +2,5 @@ - Confirm to the Opentracker coding guidelines - Implement the free_hook - Support other card types +- Implement support for more than one card +- Fix strange slowness diff --git a/src/add-ons/kernel/drivers/network/rtl8139/driver.c b/src/add-ons/kernel/drivers/network/rtl8139/driver.c index eb0681be1f..a34d920602 100644 --- a/src/add-ons/kernel/drivers/network/rtl8139/driver.c +++ b/src/add-ons/kernel/drivers/network/rtl8139/driver.c @@ -35,6 +35,13 @@ #include "ether_driver.h" #include "util.h" + +//#define RTL_NODEBUG +#ifdef RTL_NODEBUG +#define dprintf no_printf +void no_printf( const char *useless , ... ) {}; +#endif + /* ---------- global data ----- */ @@ -525,10 +532,10 @@ read_hook (void* cookie, off_t position, void *buf, size_t* num_bytes) return B_IO_ERROR; } - //Check for an error: if needed: resetrx - if ( !( packet_header->bits & 0x1 ) || packet_header->length > 1500 ) + //Check for an error: if needed: resetrx, length may not be bigger than 1514 + 4 CRC + if ( !( packet_header->bits & 0x1 ) || packet_header->length > 1518 ) { - dprintf( "rtl8139_nielx read_hook: Error in package reception!!!\n" ); + dprintf( "rtl8139_nielx read_hook: Error in package reception: bits: %u length %u!!!\n" , packet_header->bits , packet_header->length); return B_IO_ERROR; } @@ -546,7 +553,16 @@ read_hook (void* cookie, off_t position, void *buf, size_t* num_bytes) //Copy the packet *num_bytes = packet_header->length - 4; - memcpy( buf , data->receivebufferlog + data->receivebufferoffset + 4 , packet_header->length - 4); //length-4 because we don't want to copy the 4 bytes CRC + if ( data->receivebufferoffset + *num_bytes > 65536 ) + { + //Packet wraps around , copy last bits except header ( = +4 ) + memcpy( buf , data->receivebufferlog + data->receivebufferoffset + 4 , 0x10000 - ( data->receivebufferoffset + 4 ) ); + //copy remaining bytes from the beginning + memcpy( buf + 0x10000 - ( data->receivebufferoffset + 4 ) , data->receivebufferlog , *num_bytes - (0x10000 - ( data->receivebufferoffset + 4 ) ) ); + dprintf( "rtl8139_nielx read_hook: Wrapping around end of buffer\n" ); + } + else + memcpy( buf , data->receivebufferlog + data->receivebufferoffset + 4 , packet_header->length - 4); //length-4 because we don't want to copy the 4 bytes CRC //Update the buffer -- 4 for the header length, plus 3 for the dword allignment data->receivebufferoffset = ( data->receivebufferoffset + packet_header->length + 4 + 3 ) & ~3;