Improved the way that version id's were parsed. Also added version id for the
rtl8139D. Phillipe, let's start testing! git-svn-id: file:///srv/svn/repos/haiku/trunk/current@3596 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
parent
32af767502
commit
2c5845b559
@ -1,4 +1,5 @@
|
|||||||
- A major code cleanup
|
- A major code cleanup
|
||||||
- Confirm to the Opentracker coding guidelines
|
- Confirm to the Opentracker coding guidelines
|
||||||
|
- Handle receive errors
|
||||||
- Support other card types
|
- Support other card types
|
||||||
- Implement support for more than one card
|
- Implement support for more than one card
|
||||||
|
@ -57,7 +57,6 @@ static int32 rtl8139_interrupt(void *data); /* interrupt handler */
|
|||||||
enum registers {
|
enum registers {
|
||||||
IDR0 = 0x0 ,
|
IDR0 = 0x0 ,
|
||||||
Command = 0x37 ,
|
Command = 0x37 ,
|
||||||
ChipVersion = 0x43 ,
|
|
||||||
TxConfig = 0x40 ,
|
TxConfig = 0x40 ,
|
||||||
RxConfig = 0x44 ,
|
RxConfig = 0x44 ,
|
||||||
Config1 = 0x52 ,
|
Config1 = 0x52 ,
|
||||||
@ -139,7 +138,7 @@ enum BMCR_Commands {
|
|||||||
Restart_Auto_Negotiation = 0x400
|
Restart_Auto_Negotiation = 0x400
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef enum chiptype { RTL_8139_C } chiptype;
|
typedef enum chiptype { RTL_8139_C , RTL_8139_D } chiptype;
|
||||||
|
|
||||||
/* ----------
|
/* ----------
|
||||||
structure that stores internal data
|
structure that stores internal data
|
||||||
@ -285,6 +284,7 @@ open_hook(const char *name, uint32 flags, void** cookie)
|
|||||||
rtl8139_properties_t *data;
|
rtl8139_properties_t *data;
|
||||||
uint8 temp8;
|
uint8 temp8;
|
||||||
uint16 temp16;
|
uint16 temp16;
|
||||||
|
uint32 temp32;
|
||||||
unsigned char cmd;
|
unsigned char cmd;
|
||||||
|
|
||||||
dprintf( "rtl8139_nielx open_hook()\n" );
|
dprintf( "rtl8139_nielx open_hook()\n" );
|
||||||
@ -330,30 +330,34 @@ open_hook(const char *name, uint32 flags, void** cookie)
|
|||||||
cmd = cmd | PCI_command_io | PCI_command_master | PCI_command_memory;
|
cmd = cmd | PCI_command_io | PCI_command_master | PCI_command_memory;
|
||||||
m_pcimodule->write_pci_config(data->pcii->bus, data->pcii->device, data->pcii->function, PCI_command, 2, cmd );
|
m_pcimodule->write_pci_config(data->pcii->bus, data->pcii->device, data->pcii->function, PCI_command, 2, cmd );
|
||||||
|
|
||||||
// Check for the chipversion
|
// Check for the chipversion -- The version bits are bits 31-27 and 24-23
|
||||||
/*
|
temp32 = m_pcimodule->read_io_32( data->reg_base + TxConfig );
|
||||||
Please note the following:
|
|
||||||
According to the documentation only some bits are set
|
|
||||||
for the version. I will ignore this for now.
|
|
||||||
*/
|
|
||||||
temp8 = m_pcimodule->read_io_8( data->reg_base + ChipVersion );
|
|
||||||
|
|
||||||
switch ( temp8 )
|
if ( temp32 == 0xFFFFFF )
|
||||||
{
|
{
|
||||||
case 0xFF:
|
|
||||||
dprintf( "rtl8139_nielx open_hook(): Faulty chip\n" );
|
dprintf( "rtl8139_nielx open_hook(): Faulty chip\n" );
|
||||||
m_isopen = 0;
|
m_isopen = 0;
|
||||||
|
put_module( B_PCI_MODULE_NAME );
|
||||||
return EIO;
|
return EIO;
|
||||||
|
}
|
||||||
|
|
||||||
|
temp32 = temp32 & 0x7cc00000;
|
||||||
|
|
||||||
case 0x74:
|
switch( temp32 )
|
||||||
|
{
|
||||||
|
case 0x74000000:
|
||||||
dprintf( "rtl8139_nielx open_hook(): Chip is the 8139 C\n" );
|
dprintf( "rtl8139_nielx open_hook(): Chip is the 8139 C\n" );
|
||||||
data->chip_type = RTL_8139_C;
|
data->chip_type = RTL_8139_C;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 0x74400000:
|
||||||
|
dprintf( "rtl8139_niels open_hook(): Chip is the 8139 D\n" );
|
||||||
|
data->chip_type = RTL_8139_D;
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
dprintf( "rtl8139_nielx open_hook(): Unknown chip, assuming 8139 C\n" );
|
dprintf( "rtl8139_nielx open_hook(): Unknown chip, assuming 8139 C\n" );
|
||||||
data->chip_type = RTL_8139_C;
|
data->chip_type = RTL_8139_C;
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* TODO: Linux driver does power management here... */
|
/* TODO: Linux driver does power management here... */
|
||||||
@ -541,16 +545,6 @@ read_hook (void* cookie, off_t position, void *buf, size_t* num_bytes)
|
|||||||
|
|
||||||
dprintf( "rtl8139_nielx read_hook(): Packet size: %u Receiveheader: %u Buffer size: %lu\n" , packet_header->length , packet_header->bits , *num_bytes );
|
dprintf( "rtl8139_nielx read_hook(): Packet size: %u Receiveheader: %u Buffer size: %lu\n" , packet_header->length , packet_header->bits , *num_bytes );
|
||||||
|
|
||||||
// Check if the packet goes beyond the buffer
|
|
||||||
/*
|
|
||||||
if ( bufferoffset + packet_header.length > 1024 * 16 + 16 )
|
|
||||||
{
|
|
||||||
dprintf( "rtl8139_nielx read_hook(): Packet goes beyond end of buffer!\n" );
|
|
||||||
//Taken from sample code, I have no idea whether it works
|
|
||||||
memcpy( data->receivebufferlog + 1024 * 16 + 16 , data->receivebufferlog , (bufferoffset + packet_header.length - 1024 * 16 + 16 ) );
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
//Copy the packet
|
//Copy the packet
|
||||||
*num_bytes = packet_header->length - 4;
|
*num_bytes = packet_header->length - 4;
|
||||||
if ( data->receivebufferoffset + *num_bytes > 65536 )
|
if ( data->receivebufferoffset + *num_bytes > 65536 )
|
||||||
|
Loading…
Reference in New Issue
Block a user