- 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:
Oliver Tappe
2006-06-05 18:27:38 +00:00
parent a03ac89526
commit 66cd06582c
@@ -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;
} }
/* ---------- /* ----------