Ignore:
Timestamp:
2010-03-07T22:51:38Z (14 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
60ab6c3
Parents:
b5cbff4 (diff), 31c80a5 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge from lp:~lukasmejdrech/helenos/network.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/net/netif/dp8390/dp8390_module.c

    rb5cbff4 r71b00dcc  
    6868 *  @param[in] call The interrupt call.
    6969 */
    70 #define IRQ_GET_DEVICE( call )                  ( device_id_t ) IPC_GET_METHOD( * call )
     70#define IRQ_GET_DEVICE(call)                    (device_id_t) IPC_GET_METHOD(*call)
    7171
    7272/** Returns the interrupt status register from the interrupt call.
    7373 *  @param[in] call The interrupt call.
    7474 */
    75 #define IPC_GET_ISR( call )                             ( int ) IPC_GET_ARG2( * call )
     75#define IPC_GET_ISR(call)                               (int) IPC_GET_ARG2(*call)
    7676
    7777/** DP8390 kernel interrupt command sequence.
    7878 */
    7979static irq_cmd_t        dp8390_cmds[] = {
    80         {       .cmd = CMD_PIO_READ_8,
     80        {       .cmd = CMD_PIO_READ_8,
    8181                .addr = NULL,
    8282                .dstarg = 2
     
    9595 */
    9696static irq_code_t       dp8390_code = {
    97         sizeof( dp8390_cmds ) / sizeof( irq_cmd_t ),
     97        sizeof(dp8390_cmds) / sizeof(irq_cmd_t),
    9898        dp8390_cmds
    9999};
     
    106106 *  @see NAME
    107107 */
    108 void    module_print_name( void );
     108void module_print_name(void);
    109109
    110110/** Handles the interrupt messages.
     
    113113 *  @param[in] call The interrupt message.
    114114 */
    115 void    irq_handler( ipc_callid_t iid, ipc_call_t * call );
     115void irq_handler(ipc_callid_t iid, ipc_call_t * call);
    116116
    117117/** Changes the network interface state.
     
    120120 *  @returns The new state.
    121121 */
    122 int     change_state( device_ref device, device_state_t state );
    123 
    124 int netif_specific_message( ipc_callid_t callid, ipc_call_t * call, ipc_call_t * answer, int * answer_count ){
     122int change_state(device_ref device, device_state_t state);
     123
     124int netif_specific_message(ipc_callid_t callid, ipc_call_t * call, ipc_call_t * answer, int * answer_count){
    125125        return ENOTSUP;
    126126}
    127127
    128 int netif_get_device_stats( device_id_t device_id, device_stats_ref stats ){
    129         ERROR_DECLARE;
    130 
    131         device_ref              device;
    132         eth_stat_t *    de_stat;
    133 
    134         if( ! stats ) return EBADMEM;
    135         ERROR_PROPAGATE( find_device( device_id, & device ));
    136         de_stat = & (( dpeth_t * ) device->specific )->de_stat;
    137         null_device_stats( stats );
     128int netif_get_device_stats(device_id_t device_id, device_stats_ref stats){
     129        ERROR_DECLARE;
     130
     131        device_ref device;
     132        eth_stat_t * de_stat;
     133
     134        if(! stats){
     135                return EBADMEM;
     136        }
     137        ERROR_PROPAGATE(find_device(device_id, &device));
     138        de_stat = &((dpeth_t *) device->specific)->de_stat;
     139        null_device_stats(stats);
    138140        stats->receive_errors = de_stat->ets_recvErr;
    139141        stats->send_errors = de_stat->ets_sendErr;
     
    151153}
    152154
    153 void module_print_name( void ){
    154         printf( "%s", NAME );
    155 }
    156 
    157 int netif_get_addr_message( device_id_t device_id, measured_string_ref address ){
    158         ERROR_DECLARE;
    159 
    160         device_ref      device;
    161 
    162         if( ! address ) return EBADMEM;
    163         ERROR_PROPAGATE( find_device( device_id, & device ));
    164         address->value = ( char * ) ( & (( dpeth_t * ) device->specific )->de_address );
    165         address->length = CONVERT_SIZE( ether_addr_t, char, 1 );
    166         return EOK;
    167 }
    168 
    169 void irq_handler( ipc_callid_t iid, ipc_call_t * call )
     155void module_print_name(void){
     156        printf("%s", NAME);
     157}
     158
     159int netif_get_addr_message(device_id_t device_id, measured_string_ref address){
     160        ERROR_DECLARE;
     161
     162        device_ref device;
     163
     164        if(! address){
     165                return EBADMEM;
     166        }
     167        ERROR_PROPAGATE(find_device(device_id, &device));
     168        address->value = (char *) (&((dpeth_t *) device->specific)->de_address);
     169        address->length = CONVERT_SIZE(ether_addr_t, char, 1);
     170        return EOK;
     171}
     172
     173void irq_handler(ipc_callid_t iid, ipc_call_t * call)
    170174{
    171         device_ref      device;
    172         dpeth_t *       dep;
    173         packet_t        received;
    174         device_id_t     device_id;
    175         int                     phone;
    176 
    177         device_id = IRQ_GET_DEVICE( call );
    178         fibril_rwlock_write_lock( & netif_globals.lock );
    179         if( find_device( device_id, & device ) != EOK ){
    180                 fibril_rwlock_write_unlock( & netif_globals.lock );
     175        device_ref device;
     176        dpeth_t * dep;
     177        packet_t received;
     178        device_id_t device_id;
     179        int phone;
     180
     181        device_id = IRQ_GET_DEVICE(call);
     182        fibril_rwlock_write_lock(&netif_globals.lock);
     183        if(find_device(device_id, &device) != EOK){
     184                fibril_rwlock_write_unlock(&netif_globals.lock);
    181185                return;
    182186        }
    183         dep = ( dpeth_t * ) device->specific;
    184         if ( dep->de_mode != DEM_ENABLED){
    185                 fibril_rwlock_write_unlock( & netif_globals.lock );
     187        dep = (dpeth_t *) device->specific;
     188        if (dep->de_mode != DEM_ENABLED){
     189                fibril_rwlock_write_unlock(&netif_globals.lock);
    186190                return;
    187191        }
    188         assert( dep->de_flags & DEF_ENABLED);
     192        assert(dep->de_flags &DEF_ENABLED);
    189193        dep->de_int_pending = 0;
    190194//      remove debug print:
    191         printf( "I%d: 0x%x\n", device_id, IPC_GET_ISR( call ));
    192         dp_check_ints( dep, IPC_GET_ISR( call ));
    193         if( dep->received_queue ){
     195        printf("I%d: 0x%x\n", device_id, IPC_GET_ISR(call));
     196        dp_check_ints(dep, IPC_GET_ISR(call));
     197        if(dep->received_queue){
    194198                received = dep->received_queue;
    195199                phone = device->nil_phone;
    196200                dep->received_queue = NULL;
    197201                dep->received_count = 0;
    198                 fibril_rwlock_write_unlock( & netif_globals.lock );
     202                fibril_rwlock_write_unlock(&netif_globals.lock);
    199203//      remove debug dump:
    200         uint8_t *       data;
    201         data = packet_get_data( received );
    202         printf( "Receiving packet:\n\tid\t= %d\n\tlength\t= %d\n\tdata\t= %.2hhX %.2hhX %.2hhX %.2hhX:%.2hhX %.2hhX %.2hhX %.2hhX:%.2hhX %.2hhX %.2hhX %.2hhX:%.2hhX %.2hhX %.2hhX %.2hhX:%.2hhX %.2hhX %.2hhX %.2hhX:%.2hhX %.2hhX\n\t\t%.2hhX %.2hhX:%.2hhX %.2hhX %.2hhX %.2hhX:%.2hhX %.2hhX %.2hhX %.2hhX:%.2hhX %.2hhX %.2hhX %.2hhX:%.2hhX %.2hhX %.2hhX %.2hhX:%.2hhX %.2hhX %.2hhX %.2hhX:%.2hhX %.2hhX %.2hhX %.2hhX:%.2hhX %.2hhX %.2hhX %.2hhX:%.2hhX %.2hhX %.2hhX %.2hhX:%.2hhX %.2hhX %.2hhX %.2hhX\n", packet_get_id( received ), packet_get_data_length( received ), data[ 0 ], data[ 1 ], data[ 2 ], data[ 3 ], data[ 4 ], data[ 5 ], data[ 6 ], data[ 7 ], data[ 8 ], data[ 9 ], data[ 10 ], data[ 11 ], data[ 12 ], data[ 13 ], data[ 14 ], data[ 15 ], data[ 16 ], data[ 17 ], data[ 18 ], data[ 19 ], data[ 20 ], data[ 21 ], data[ 22 ], data[ 23 ], data[ 24 ], data[ 25 ], data[ 26 ], data[ 27 ], data[ 28 ], data[ 29 ], data[ 30 ], data[ 31 ], data[ 32 ], data[ 33 ], data[ 34 ], data[ 35 ], data[ 36 ], data[ 37 ], data[ 38 ], data[ 39 ], data[ 40 ], data[ 41 ], data[ 42 ], data[ 43 ], data[ 44 ], data[ 45 ], data[ 46 ], data[ 47 ], data[ 48 ], data[ 49 ], data[ 50 ], data[ 51 ], data[ 52 ], data[ 53 ], data[ 54 ], data[ 55 ], data[ 56 ], data[ 57 ], data[ 58 ], data[ 59 ] );
    203                 nil_received_msg( phone, device_id, received, NULL );
     204        uint8_t * data;
     205        data = packet_get_data(received);
     206        printf("Receiving packet:\n\tid\t= %d\n\tlength\t= %d\n\tdata\t= %.2hhX %.2hhX %.2hhX %.2hhX:%.2hhX %.2hhX %.2hhX %.2hhX:%.2hhX %.2hhX %.2hhX %.2hhX:%.2hhX %.2hhX %.2hhX %.2hhX:%.2hhX %.2hhX %.2hhX %.2hhX:%.2hhX %.2hhX\n\t\t%.2hhX %.2hhX:%.2hhX %.2hhX %.2hhX %.2hhX:%.2hhX %.2hhX %.2hhX %.2hhX:%.2hhX %.2hhX %.2hhX %.2hhX:%.2hhX %.2hhX %.2hhX %.2hhX:%.2hhX %.2hhX %.2hhX %.2hhX:%.2hhX %.2hhX %.2hhX %.2hhX:%.2hhX %.2hhX %.2hhX %.2hhX:%.2hhX %.2hhX %.2hhX %.2hhX:%.2hhX %.2hhX %.2hhX %.2hhX\n", packet_get_id(received), packet_get_data_length(received), data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7], data[8], data[9], data[10], data[11], data[12], data[13], data[14], data[15], data[16], data[17], data[18], data[19], data[20], data[21], data[22], data[23], data[24], data[25], data[26], data[27], data[28], data[29], data[30], data[31], data[32], data[33], data[34], data[35], data[36], data[37], data[38], data[39], data[40], data[41], data[42], data[43], data[44], data[45], data[46], data[47], data[48], data[49], data[50], data[51], data[52], data[53], data[54], data[55], data[56], data[57], data[58], data[59]);
     207                nil_received_msg(phone, device_id, received, NULL);
    204208        }else{
    205                 fibril_rwlock_write_unlock( & netif_globals.lock );
    206         }
    207         ipc_answer_0( iid, EOK );
    208 }
    209 
    210 int netif_probe_message( device_id_t device_id, int irq, uintptr_t io ){
    211         ERROR_DECLARE;
    212 
    213         device_ref      device;
    214         dpeth_t *       dep;
    215 
    216         device = ( device_ref ) malloc( sizeof( device_t ));
    217         if( ! device ) return ENOMEM;
    218         dep = ( dpeth_t * ) malloc( sizeof( dpeth_t ));
    219         if( ! dep ){
    220                 free( device );
     209                fibril_rwlock_write_unlock(&netif_globals.lock);
     210        }
     211        ipc_answer_0(iid, EOK);
     212}
     213
     214int netif_probe_message(device_id_t device_id, int irq, uintptr_t io){
     215        ERROR_DECLARE;
     216
     217        device_ref device;
     218        dpeth_t * dep;
     219
     220        device = (device_ref) malloc(sizeof(device_t));
     221        if(! device){
    221222                return ENOMEM;
    222223        }
    223         bzero( device, sizeof( device_t ));
    224         bzero( dep, sizeof( dpeth_t ));
     224        dep = (dpeth_t *) malloc(sizeof(dpeth_t));
     225        if(! dep){
     226                free(device);
     227                return ENOMEM;
     228        }
     229        bzero(device, sizeof(device_t));
     230        bzero(dep, sizeof(dpeth_t));
    225231        device->device_id = device_id;
    226232        device->nil_phone = -1;
    227         device->specific = ( void * ) dep;
     233        device->specific = (void *) dep;
    228234        device->state = NETIF_STOPPED;
    229235        dep->de_irq = irq;
    230236        dep->de_mode = DEM_DISABLED;
    231237        //TODO address?
    232         if( ERROR_OCCURRED( pio_enable(( void * ) io, DP8390_IO_SIZE, ( void ** ) & dep->de_base_port ))
    233         || ERROR_OCCURRED( do_probe( dep ))){
    234                 free( dep );
    235                 free( device );
     238        if(ERROR_OCCURRED(pio_enable((void *) io, DP8390_IO_SIZE, (void **) &dep->de_base_port))
     239                || ERROR_OCCURRED(do_probe(dep))){
     240                free(dep);
     241                free(device);
    236242                return ERROR_CODE;
    237243        }
    238         if( ERROR_OCCURRED( device_map_add( & netif_globals.device_map, device->device_id, device ))){
    239                 free( dep );
    240                 free( device );
     244        if(ERROR_OCCURRED(device_map_add(&netif_globals.device_map, device->device_id, device))){
     245                free(dep);
     246                free(device);
    241247                return ERROR_CODE;
    242248        }
     
    244250}
    245251
    246 int netif_send_message( device_id_t device_id, packet_t packet, services_t sender ){
    247         ERROR_DECLARE;
    248 
    249         device_ref      device;
    250         dpeth_t *       dep;
    251         packet_t        next;
    252 
    253         ERROR_PROPAGATE( find_device( device_id, & device ));
    254         if( device->state != NETIF_ACTIVE ){
    255                 netif_pq_release( packet_get_id( packet ));
     252int netif_send_message(device_id_t device_id, packet_t packet, services_t sender){
     253        ERROR_DECLARE;
     254
     255        device_ref device;
     256        dpeth_t * dep;
     257        packet_t next;
     258
     259        ERROR_PROPAGATE(find_device(device_id, &device));
     260        if(device->state != NETIF_ACTIVE){
     261                netif_pq_release(packet_get_id(packet));
    256262                return EFORWARD;
    257263        }
    258         dep = ( dpeth_t * ) device->specific;
     264        dep = (dpeth_t *) device->specific;
    259265        // process packet queue
    260266        do{
    261                 next = pq_detach( packet );
     267                next = pq_detach(packet);
    262268//              remove debug dump:
    263                 uint8_t *       data;
    264                 data = packet_get_data( packet );
    265                 printf( "Sending packet:\n\tid\t= %d\n\tlength\t= %d\n\tdata\t= %.2hhX %.2hhX %.2hhX %.2hhX:%.2hhX %.2hhX %.2hhX %.2hhX:%.2hhX %.2hhX %.2hhX %.2hhX:%.2hhX %.2hhX %.2hhX %.2hhX:%.2hhX %.2hhX %.2hhX %.2hhX:%.2hhX %.2hhX\n\t\t%.2hhX %.2hhX:%.2hhX %.2hhX %.2hhX %.2hhX:%.2hhX %.2hhX %.2hhX %.2hhX:%.2hhX %.2hhX %.2hhX %.2hhX:%.2hhX %.2hhX %.2hhX %.2hhX:%.2hhX %.2hhX %.2hhX %.2hhX:%.2hhX %.2hhX %.2hhX %.2hhX:%.2hhX %.2hhX %.2hhX %.2hhX:%.2hhX %.2hhX %.2hhX %.2hhX:%.2hhX %.2hhX %.2hhX %.2hhX\n", packet_get_id( packet ), packet_get_data_length( packet ), data[ 0 ], data[ 1 ], data[ 2 ], data[ 3 ], data[ 4 ], data[ 5 ], data[ 6 ], data[ 7 ], data[ 8 ], data[ 9 ], data[ 10 ], data[ 11 ], data[ 12 ], data[ 13 ], data[ 14 ], data[ 15 ], data[ 16 ], data[ 17 ], data[ 18 ], data[ 19 ], data[ 20 ], data[ 21 ], data[ 22 ], data[ 23 ], data[ 24 ], data[ 25 ], data[ 26 ], data[ 27 ], data[ 28 ], data[ 29 ], data[ 30 ], data[ 31 ], data[ 32 ], data[ 33 ], data[ 34 ], data[ 35 ], data[ 36 ], data[ 37 ], data[ 38 ], data[ 39 ], data[ 40 ], data[ 41 ], data[ 42 ], data[ 43 ], data[ 44 ], data[ 45 ], data[ 46 ], data[ 47 ], data[ 48 ], data[ 49 ], data[ 50 ], data[ 51 ], data[ 52 ], data[ 53 ], data[ 54 ], data[ 55 ], data[ 56 ], data[ 57 ], data[ 58 ], data[ 59 ] );
    266 
    267                 if( do_pwrite( dep, packet, FALSE ) != EBUSY ){
    268                         netif_pq_release( packet_get_id( packet ));
     269                uint8_t * data;
     270                data = packet_get_data(packet);
     271                printf("Sending packet:\n\tid\t= %d\n\tlength\t= %d\n\tdata\t= %.2hhX %.2hhX %.2hhX %.2hhX:%.2hhX %.2hhX %.2hhX %.2hhX:%.2hhX %.2hhX %.2hhX %.2hhX:%.2hhX %.2hhX %.2hhX %.2hhX:%.2hhX %.2hhX %.2hhX %.2hhX:%.2hhX %.2hhX\n\t\t%.2hhX %.2hhX:%.2hhX %.2hhX %.2hhX %.2hhX:%.2hhX %.2hhX %.2hhX %.2hhX:%.2hhX %.2hhX %.2hhX %.2hhX:%.2hhX %.2hhX %.2hhX %.2hhX:%.2hhX %.2hhX %.2hhX %.2hhX:%.2hhX %.2hhX %.2hhX %.2hhX:%.2hhX %.2hhX %.2hhX %.2hhX:%.2hhX %.2hhX %.2hhX %.2hhX:%.2hhX %.2hhX %.2hhX %.2hhX\n", packet_get_id(packet), packet_get_data_length(packet), data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7], data[8], data[9], data[10], data[11], data[12], data[13], data[14], data[15], data[16], data[17], data[18], data[19], data[20], data[21], data[22], data[23], data[24], data[25], data[26], data[27], data[28], data[29], data[30], data[31], data[32], data[33], data[34], data[35], data[36], data[37], data[38], data[39], data[40], data[41], data[42], data[43], data[44], data[45], data[46], data[47], data[48], data[49], data[50], data[51], data[52], data[53], data[54], data[55], data[56], data[57], data[58], data[59]);
     272
     273                if(do_pwrite(dep, packet, FALSE) != EBUSY){
     274                        netif_pq_release(packet_get_id(packet));
    269275                }
    270276                packet = next;
    271         }while( packet );
    272         return EOK;
    273 }
    274 
    275 int     netif_start_message( device_ref device ){
    276         ERROR_DECLARE;
    277 
    278         dpeth_t *       dep;
    279 
    280         if( device->state != NETIF_ACTIVE ){
    281                 dep = ( dpeth_t * ) device->specific;
    282                 dp8390_cmds[ 0 ].addr = ( void * ) ( uintptr_t ) ( dep->de_dp8390_port + DP_ISR );
    283                 dp8390_cmds[ 2 ].addr = dp8390_cmds[ 0 ].addr;
    284                 ERROR_PROPAGATE( ipc_register_irq( dep->de_irq, device->device_id, device->device_id, & dp8390_code ));
    285                 if( ERROR_OCCURRED( do_init( dep, DL_BROAD_REQ ))){
    286                         ipc_unregister_irq( dep->de_irq, device->device_id );
     277        }while(packet);
     278        return EOK;
     279}
     280
     281int netif_start_message(device_ref device){
     282        ERROR_DECLARE;
     283
     284        dpeth_t * dep;
     285
     286        if(device->state != NETIF_ACTIVE){
     287                dep = (dpeth_t *) device->specific;
     288                dp8390_cmds[0].addr = (void *) (uintptr_t) (dep->de_dp8390_port + DP_ISR);
     289                dp8390_cmds[2].addr = dp8390_cmds[0].addr;
     290                ERROR_PROPAGATE(ipc_register_irq(dep->de_irq, device->device_id, device->device_id, &dp8390_code));
     291                if(ERROR_OCCURRED(do_init(dep, DL_BROAD_REQ))){
     292                        ipc_unregister_irq(dep->de_irq, device->device_id);
    287293                        return ERROR_CODE;
    288294                }
    289                 return change_state( device, NETIF_ACTIVE );
    290         }
    291         return EOK;
    292 }
    293 
    294 int     netif_stop_message( device_ref device ){
    295         dpeth_t *       dep;
    296 
    297         if( device->state != NETIF_STOPPED ){
    298                 dep = ( dpeth_t * ) device->specific;
    299                 do_stop( dep );
    300                 ipc_unregister_irq( dep->de_irq, device->device_id );
    301                 return change_state( device, NETIF_STOPPED );
    302         }
    303         return EOK;
    304 }
    305 
    306 int change_state( device_ref device, device_state_t state ){
     295                return change_state(device, NETIF_ACTIVE);
     296        }
     297        return EOK;
     298}
     299
     300int netif_stop_message(device_ref device){
     301        dpeth_t * dep;
     302
     303        if(device->state != NETIF_STOPPED){
     304                dep = (dpeth_t *) device->specific;
     305                do_stop(dep);
     306                ipc_unregister_irq(dep->de_irq, device->device_id);
     307                return change_state(device, NETIF_STOPPED);
     308        }
     309        return EOK;
     310}
     311
     312int change_state(device_ref device, device_state_t state){
    307313        device->state = state;
    308         printf( "State changed to %s\n", ( state == NETIF_ACTIVE ) ? "ACTIVE" : "STOPPED" );
     314        printf("State changed to %s\n", (state == NETIF_ACTIVE) ? "ACTIVE" : "STOPPED");
    309315        return state;
    310316}
    311317
    312 int netif_initialize( void ){
    313         ipcarg_t        phonehash;
    314 
    315         async_set_interrupt_received( irq_handler );
    316 
    317         return REGISTER_ME( SERVICE_DP8390, & phonehash );
     318int netif_initialize(void){
     319        ipcarg_t phonehash;
     320
     321        async_set_interrupt_received(irq_handler);
     322
     323        return REGISTER_ME(SERVICE_DP8390, &phonehash);
    318324}
    319325
Note: See TracChangeset for help on using the changeset viewer.