- fixed protection against multiple opens of a device
- minor cleanup git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@17729 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -64,10 +64,10 @@ typedef struct supported_device {
|
|||||||
/* ----------
|
/* ----------
|
||||||
global data
|
global data
|
||||||
----- */
|
----- */
|
||||||
static pci_info *m_devices[RTL_MAX_CARDS];
|
static pci_info *gFoundDevices[RTL_MAX_CARDS];
|
||||||
static pci_module_info *m_pcimodule = 0; //To call methods of pci
|
static pci_module_info *gPCIModule = 0; //To call methods of pci
|
||||||
static char *rtl8139_names[RTL_MAX_CARDS +1];
|
static char *gDeviceNames[RTL_MAX_CARDS +1];
|
||||||
static int32 m_openmask = 0; //Is the thing already opened?
|
static int32 gDeviceOpenMask = 0; //Is the thing already opened?
|
||||||
|
|
||||||
static supported_device_t m_supported_devices[] = {
|
static supported_device_t m_supported_devices[] = {
|
||||||
{ 0x10ec, 0x8139, "RealTek RTL8139 Fast Ethernet" },
|
{ 0x10ec, 0x8139, "RealTek RTL8139 Fast Ethernet" },
|
||||||
@@ -136,13 +136,13 @@ static status_t close_hook( void * );
|
|||||||
Here all platform dependant code is placed: this keeps the code clean
|
Here all platform dependant code is placed: this keeps the code clean
|
||||||
----- */
|
----- */
|
||||||
#ifdef __INTEL__
|
#ifdef __INTEL__
|
||||||
#define WRITE_8( offset , value) (m_pcimodule->write_io_8 ((data->reg_base + (offset)), (value) ) )
|
#define WRITE_8( offset , value) (gPCIModule->write_io_8 ((data->reg_base + (offset)), (value) ) )
|
||||||
#define WRITE_16( offset , value) (m_pcimodule->write_io_16((data->reg_base + (offset)), (value) ) )
|
#define WRITE_16( offset , value) (gPCIModule->write_io_16((data->reg_base + (offset)), (value) ) )
|
||||||
#define WRITE_32( offset , value) (m_pcimodule->write_io_32((data->reg_base + (offset)), (value) ) )
|
#define WRITE_32( offset , value) (gPCIModule->write_io_32((data->reg_base + (offset)), (value) ) )
|
||||||
|
|
||||||
#define READ_8( offset ) (m_pcimodule->read_io_8 ((data->reg_base + offset)))
|
#define READ_8( offset ) (gPCIModule->read_io_8 ((data->reg_base + offset)))
|
||||||
#define READ_16( offset ) (m_pcimodule->read_io_16((data->reg_base + offset)))
|
#define READ_16( offset ) (gPCIModule->read_io_16((data->reg_base + offset)))
|
||||||
#define READ_32( offset ) (m_pcimodule->read_io_32((data->reg_base + offset)))
|
#define READ_32( offset ) (gPCIModule->read_io_32((data->reg_base + offset)))
|
||||||
|
|
||||||
static void rtl8139_init_registers( rtl8139_properties_t *data )
|
static void rtl8139_init_registers( rtl8139_properties_t *data )
|
||||||
{
|
{
|
||||||
@@ -207,7 +207,7 @@ init_driver (void)
|
|||||||
TRACE( "rtl8139_nielx: init_driver()\n" );
|
TRACE( "rtl8139_nielx: init_driver()\n" );
|
||||||
|
|
||||||
// Try if the PCI module is loaded (it would be weird if it wouldn't, but alas)
|
// Try if the PCI module is loaded (it would be weird if it wouldn't, but alas)
|
||||||
if( ( status = get_module( B_PCI_MODULE_NAME, (module_info **)&m_pcimodule )) != B_OK)
|
if( ( status = get_module( B_PCI_MODULE_NAME, (module_info **)&gPCIModule )) != B_OK)
|
||||||
{
|
{
|
||||||
TRACE( "rtl8139_nielx init_driver(): Get PCI module failed! %lu \n", status);
|
TRACE( "rtl8139_nielx init_driver(): Get PCI module failed! %lu \n", status);
|
||||||
return status;
|
return status;
|
||||||
@@ -216,7 +216,7 @@ init_driver (void)
|
|||||||
//
|
//
|
||||||
i = 0;
|
i = 0;
|
||||||
item = (pci_info *)malloc(sizeof(pci_info));
|
item = (pci_info *)malloc(sizeof(pci_info));
|
||||||
for ( i = found = 0 ; m_pcimodule->get_nth_pci_info(i, item) == B_OK ; i++ )
|
for ( i = found = 0 ; gPCIModule->get_nth_pci_info(i, item) == B_OK ; i++ )
|
||||||
{
|
{
|
||||||
supported_device_t *supported;
|
supported_device_t *supported;
|
||||||
|
|
||||||
@@ -232,7 +232,7 @@ init_driver (void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
TRACE("rtl8139_nielx init_driver(): found %s at IRQ %u \n", supported->name, item->u.h0.interrupt_line);
|
TRACE("rtl8139_nielx init_driver(): found %s at IRQ %u \n", supported->name, item->u.h0.interrupt_line);
|
||||||
m_devices[found] = item;
|
gFoundDevices[found] = item;
|
||||||
item = (pci_info *)malloc(sizeof(pci_info));
|
item = (pci_info *)malloc(sizeof(pci_info));
|
||||||
found++;
|
found++;
|
||||||
}
|
}
|
||||||
@@ -256,9 +256,9 @@ init_driver (void)
|
|||||||
for (i = 0; i < found; i++)
|
for (i = 0; i < found; i++)
|
||||||
{
|
{
|
||||||
sprintf(name, "net/rtl8139/%ld", i);
|
sprintf(name, "net/rtl8139/%ld", i);
|
||||||
rtl8139_names[i] = strdup(name);
|
gDeviceNames[i] = strdup(name);
|
||||||
}
|
}
|
||||||
rtl8139_names[i] = NULL;
|
gDeviceNames[i] = NULL;
|
||||||
}
|
}
|
||||||
return B_OK;
|
return B_OK;
|
||||||
}
|
}
|
||||||
@@ -275,10 +275,10 @@ uninit_driver (void)
|
|||||||
void *item;
|
void *item;
|
||||||
TRACE( "rtl8139_nielx: uninit_driver()\n" );
|
TRACE( "rtl8139_nielx: uninit_driver()\n" );
|
||||||
|
|
||||||
for (index = 0; (item = rtl8139_names[index]) != NULL; index++)
|
for (index = 0; (item = gDeviceNames[index]) != NULL; index++)
|
||||||
{
|
{
|
||||||
free(item);
|
free(item);
|
||||||
free(m_devices[index]);
|
free(gFoundDevices[index]);
|
||||||
}
|
}
|
||||||
|
|
||||||
put_module( B_PCI_MODULE_NAME );
|
put_module( B_PCI_MODULE_NAME );
|
||||||
@@ -297,6 +297,7 @@ open_hook(const char *name, uint32 flags, void** cookie)
|
|||||||
{
|
{
|
||||||
|
|
||||||
rtl8139_properties_t *data;
|
rtl8139_properties_t *data;
|
||||||
|
uint8 id;
|
||||||
uint8 temp8;
|
uint8 temp8;
|
||||||
uint16 temp16;
|
uint16 temp16;
|
||||||
uint32 temp32;
|
uint32 temp32;
|
||||||
@@ -310,7 +311,7 @@ open_hook(const char *name, uint32 flags, void** cookie)
|
|||||||
int32 mask;
|
int32 mask;
|
||||||
|
|
||||||
// search for device name
|
// search for device name
|
||||||
for (temp8 = 0; (thisName = rtl8139_names[temp8]) != NULL; temp8++) {
|
for (id = 0; (thisName = gDeviceNames[id]) != NULL; id++) {
|
||||||
if (!strcmp(name, thisName))
|
if (!strcmp(name, thisName))
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -318,8 +319,8 @@ open_hook(const char *name, uint32 flags, void** cookie)
|
|||||||
return EINVAL;
|
return EINVAL;
|
||||||
|
|
||||||
// check if device is already open
|
// check if device is already open
|
||||||
mask = 1L << temp8;
|
mask = 1L << id;
|
||||||
if (atomic_or(&m_openmask, mask) & mask)
|
if (atomic_or(&gDeviceOpenMask, mask) & mask)
|
||||||
return B_BUSY;
|
return B_BUSY;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -327,17 +328,15 @@ open_hook(const char *name, uint32 flags, void** cookie)
|
|||||||
if (!(*cookie = data = (rtl8139_properties_t *)malloc(sizeof(rtl8139_properties_t))))
|
if (!(*cookie = data = (rtl8139_properties_t *)malloc(sizeof(rtl8139_properties_t))))
|
||||||
{
|
{
|
||||||
TRACE( "rtl8139_nielx open_hook(): Out of memory\n" );
|
TRACE( "rtl8139_nielx open_hook(): Out of memory\n" );
|
||||||
|
gDeviceOpenMask &= ~( 1L << id );
|
||||||
return B_NO_MEMORY;
|
return B_NO_MEMORY;
|
||||||
}
|
}
|
||||||
|
|
||||||
//Set status to open:
|
|
||||||
m_openmask &= ~( 1L << temp8 );
|
|
||||||
|
|
||||||
//Clear memory
|
//Clear memory
|
||||||
memset( data , 0 , sizeof( rtl8139_properties_t ) );
|
memset( data , 0 , sizeof( rtl8139_properties_t ) );
|
||||||
|
|
||||||
//Set the ID
|
//Set the ID
|
||||||
data->device_id = temp8;
|
data->device_id = id;
|
||||||
|
|
||||||
// Create lock
|
// Create lock
|
||||||
data->lock = create_sem( 1 , "rtl8139_nielx data protect" );
|
data->lock = create_sem( 1 , "rtl8139_nielx data protect" );
|
||||||
@@ -348,15 +347,15 @@ open_hook(const char *name, uint32 flags, void** cookie)
|
|||||||
set_sem_owner( data->output_wait , B_SYSTEM_TEAM );
|
set_sem_owner( data->output_wait , B_SYSTEM_TEAM );
|
||||||
|
|
||||||
//Set up the cookie
|
//Set up the cookie
|
||||||
data->pcii = m_devices[data->device_id];
|
data->pcii = gFoundDevices[data->device_id];
|
||||||
|
|
||||||
//Enable the registers
|
//Enable the registers
|
||||||
rtl8139_init_registers( data );
|
rtl8139_init_registers( data );
|
||||||
|
|
||||||
/* enable pci address access */
|
/* enable pci address access */
|
||||||
cmd = m_pcimodule->read_pci_config(data->pcii->bus, data->pcii->device, data->pcii->function, PCI_command, 2);
|
cmd = gPCIModule->read_pci_config(data->pcii->bus, data->pcii->device, data->pcii->function, PCI_command, 2);
|
||||||
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 );
|
gPCIModule->write_pci_config(data->pcii->bus, data->pcii->device, data->pcii->function, PCI_command, 2, cmd );
|
||||||
|
|
||||||
// Check for the chipversion -- The version bits are bits 31-27 and 24-23
|
// Check for the chipversion -- The version bits are bits 31-27 and 24-23
|
||||||
temp32 = READ_32( TxConfig );
|
temp32 = READ_32( TxConfig );
|
||||||
@@ -910,6 +909,10 @@ close_hook (void* cookie)
|
|||||||
//Stop Rx and Tx process
|
//Stop Rx and Tx process
|
||||||
WRITE_8( Command , 0 );
|
WRITE_8( Command , 0 );
|
||||||
WRITE_16( IMR , 0 );
|
WRITE_16( IMR , 0 );
|
||||||
|
|
||||||
|
// mark this device as closed
|
||||||
|
gDeviceOpenMask &= ~(1L << data->device_id);
|
||||||
|
|
||||||
return B_OK;
|
return B_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -935,8 +938,6 @@ free_hook (void* cookie)
|
|||||||
delete_area( data->transmitbuffer[2] );
|
delete_area( data->transmitbuffer[2] );
|
||||||
delete_area( data->ioarea ); //Only does something on ppc
|
delete_area( data->ioarea ); //Only does something on ppc
|
||||||
|
|
||||||
m_openmask &= ~(1L << data->device_id);
|
|
||||||
|
|
||||||
//Finally, free the cookie
|
//Finally, free the cookie
|
||||||
free( data );
|
free( data );
|
||||||
|
|
||||||
@@ -968,7 +969,7 @@ device_hooks rtl8139_hooks = {
|
|||||||
const char**
|
const char**
|
||||||
publish_devices()
|
publish_devices()
|
||||||
{
|
{
|
||||||
return (const char **)rtl8139_names;
|
return (const char **)gDeviceNames;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ----------
|
/* ----------
|
||||||
|
|||||||
Reference in New Issue
Block a user