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; |
} |
|
/** @} |
*/ |