Subversion Repositories HelenOS

Compare Revisions

Ignore whitespace Rev 4260 → Rev 4261

/branches/network/uspace/srv/net/netif/dp8390/dp8390_module.c
49,6 → 49,7
#include "../../structures/measured_strings.h"
 
#include "../../include/device.h"
#include "../../include/nil_messages.h"
 
#include "../netif.h"
#include "../netif_interface.h"
55,12 → 56,11
 
#include "dp8390.h"
#include "dp8390_drv.h"
#include "dp8390_module.h"
#include "dp8390_port.h"
 
#define NAME "dp8390 network interface"
 
#define IPC_GET_DEVICE( call ) ( device_id_t ) IPC_GET_METHOD( * call )
#define IRQ_GET_DEVICE( call ) ( device_id_t ) IPC_GET_METHOD( * call )
#define IPC_GET_ISR( call ) ( int ) IPC_GET_ARG2( * call )
 
static irq_cmd_t dp8390_cmds[] = {
92,7 → 92,7
void netif_print_name( void );
 
void irq_handler( ipc_callid_t iid, ipc_call_t * call );
void change_state( device_ref device, device_state_t state );
int change_state( device_ref device, device_state_t state );
 
int netif_specific_message( ipc_callid_t callid, ipc_call_t * call, ipc_call_t * answer, int * answer_count ){
return ENOTSUP;
144,14 → 144,24
// int irq;
device_ref device;
dpeth_t * dep;
packet_t received;
device_id_t device_id;
int phone;
 
printf( "\ndevice %d - irq %x", IPC_GET_DEVICE( call ), IPC_GET_ISR( call ));
if( find_device( IPC_GET_DEVICE( call ), & device ) != EOK ) return;
device_id = IRQ_GET_DEVICE( call );
// printf( "\ndevice %d - irq %x", device_id, IPC_GET_ISR( call ));
rwlock_write_lock( & netif_globals.lock );
if( find_device( device_id, & device ) != EOK ){
rwlock_write_unlock( & netif_globals.lock );
return;
}
dep = ( dpeth_t * ) device->specific;
printf( "\ndev %d, irq %x\n", device->device_id, IPC_GET_ISR( call ));
if ( dep->de_mode != DEM_ENABLED)
// printf( "\ndev %d, irq %x\n", device->device_id, IPC_GET_ISR( call ));
if ( dep->de_mode != DEM_ENABLED){
// continue;
rwlock_write_unlock( & netif_globals.lock );
return;
}
assert( dep->de_flags & DEF_ENABLED);
// irq= dep.de_irq;
// assert(irq >= 0 && irq < NR_IRQ_VECTORS);
167,6 → 177,15
"unable enable interrupts", r);
}
*/// }
if( dep->received_queue ){
received = dep->received_queue;
phone = device->nil_phone;
dep->received_queue = NULL;
rwlock_write_unlock( & netif_globals.lock );
nil_received_msg( phone, device_id, received, NULL );
}else{
rwlock_write_unlock( & netif_globals.lock );
}
ipc_answer_0( iid, EOK );
}
 
194,7 → 213,6
device->nil_phone = -1;
device->specific = ( void * ) dep;
device->state = NETIF_STOPPED;
dep->parent = device;
dep->de_irq = irq;
dep->de_mode = DEM_DISABLED;
//TODO address?
212,7 → 230,7
return EOK;
}
 
int netif_send_message( device_id_t device_id, packet_t packet ){
int netif_send_message( device_id_t device_id, packet_t packet, services_t sender ){
ERROR_DECLARE;
 
device_ref device;
236,13 → 254,11
return EOK;
}
 
int netif_start_message( device_id_t device_id ){
int netif_start_message( device_ref device ){
ERROR_DECLARE;
 
device_ref device;
dpeth_t * dep;
 
ERROR_PROPAGATE( find_device( device_id, & device ));
if( device->state != NETIF_ACTIVE ){
dep = ( dpeth_t * ) device->specific;
dp8390_cmds[ 0 ].addr = ( void * ) ( uint32_t ) ( dep->de_dp8390_port + DP_ISR );
252,31 → 268,27
ipc_unregister_irq( dep->de_irq, device->device_id );
return ERROR_CODE;
}
change_state( device, NETIF_ACTIVE );
return change_state( device, NETIF_ACTIVE );
}
return EOK;
}
 
int netif_stop_message( device_id_t device_id ){
ERROR_DECLARE;
 
device_ref device;
int netif_stop_message( device_ref device ){
dpeth_t * dep;
 
ERROR_PROPAGATE( find_device( device_id, & device ));
if( device->state != NETIF_STOPPED ){
dep = ( dpeth_t * ) device->specific;
do_stop( dep );
ipc_unregister_irq( dep->de_irq, device->device_id );
change_state( device, NETIF_STOPPED );
return change_state( device, NETIF_STOPPED );
}
return EOK;
}
 
void change_state( device_ref device, device_state_t state ){
int change_state( device_ref device, device_state_t state ){
device->state = state;
nil_message( device, NET_NIL_DEVICE_STATE, device->state, NULL );
printf( "\nState changed to %s", ( state == NETIF_ACTIVE ) ? "ACTIVE" : "STOPPED" );
return state;
}
 
int netif_initialize( void ){
287,11 → 299,5
return REGISTER_ME( SERVICE_DP8390, & phonehash );
}
 
int netif_send_packet( dpeth_t * dep, packet_t packet ){
if( !( dep && dep->parent )) return EINVAL;
nil_message(( device_ref ) dep->parent, NET_NIL_RECEIVED, packet_get_id( packet ), 0 );
return EOK;
}
 
/** @}
*/