Changes in uspace/srv/net/netif/dp8390/dp8390_module.c [48f01d8e:aadf01e] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/net/netif/dp8390/dp8390_module.c
r48f01d8e raadf01e 68 68 * @param[in] call The interrupt call. 69 69 */ 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) 71 71 72 72 /** Returns the interrupt status register from the interrupt call. 73 73 * @param[in] call The interrupt call. 74 74 */ 75 #define IPC_GET_ISR( call ) ( int ) IPC_GET_ARG2( * call)75 #define IPC_GET_ISR(call) (int) IPC_GET_ARG2(*call) 76 76 77 77 /** DP8390 kernel interrupt command sequence. 78 78 */ 79 79 static irq_cmd_t dp8390_cmds[] = { 80 { 80 { .cmd = CMD_PIO_READ_8, 81 81 .addr = NULL, 82 82 .dstarg = 2 … … 95 95 */ 96 96 static irq_code_t dp8390_code = { 97 sizeof( dp8390_cmds ) / sizeof( irq_cmd_t),97 sizeof(dp8390_cmds) / sizeof(irq_cmd_t), 98 98 dp8390_cmds 99 99 }; … … 106 106 * @see NAME 107 107 */ 108 void module_print_name( void);108 void module_print_name(void); 109 109 110 110 /** Handles the interrupt messages. … … 113 113 * @param[in] call The interrupt message. 114 114 */ 115 void irq_handler( ipc_callid_t iid, ipc_call_t * call);115 void irq_handler(ipc_callid_t iid, ipc_call_t * call); 116 116 117 117 /** Changes the network interface state. … … 120 120 * @returns The new state. 121 121 */ 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){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){ 125 125 return ENOTSUP; 126 126 } 127 127 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 ); 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){ 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); 138 140 stats->receive_errors = de_stat->ets_recvErr; 139 141 stats->send_errors = de_stat->ets_sendErr; … … 151 153 } 152 154 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 ) 155 void module_print_name(void){ 156 printf("%s", NAME); 157 } 158 159 int 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 173 void irq_handler(ipc_callid_t iid, ipc_call_t * call) 170 174 { 171 device_ref 172 dpeth_t * 173 packet_t 174 device_id_t 175 int 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); 181 185 return; 182 186 } 183 dep = ( dpeth_t *) device->specific;184 if ( 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); 186 190 return; 187 191 } 188 assert( dep->de_flags &DEF_ENABLED);192 assert(dep->de_flags &DEF_ENABLED); 189 193 dep->de_int_pending = 0; 190 194 // 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){ 194 198 received = dep->received_queue; 195 199 phone = device->nil_phone; 196 200 dep->received_queue = NULL; 197 201 dep->received_count = 0; 198 fibril_rwlock_write_unlock( & netif_globals.lock);202 fibril_rwlock_write_unlock(&netif_globals.lock); 199 203 // remove debug dump: 200 uint8_t * 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); 204 208 }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 214 int 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){ 221 222 return ENOMEM; 222 223 } 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)); 225 231 device->device_id = device_id; 226 232 device->nil_phone = -1; 227 device->specific = ( void *) dep;233 device->specific = (void *) dep; 228 234 device->state = NETIF_STOPPED; 229 235 dep->de_irq = irq; 230 236 dep->de_mode = DEM_DISABLED; 231 237 //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); 236 242 return ERROR_CODE; 237 243 } 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); 241 247 return ERROR_CODE; 242 248 } … … 244 250 } 245 251 246 int netif_send_message( device_id_t device_id, packet_t packet, services_t sender){247 ERROR_DECLARE; 248 249 device_ref 250 dpeth_t * 251 packet_t 252 253 ERROR_PROPAGATE( find_device( device_id, & device));254 if( device->state != NETIF_ACTIVE){255 netif_pq_release( packet_get_id( packet));252 int 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)); 256 262 return EFORWARD; 257 263 } 258 dep = ( dpeth_t *) device->specific;264 dep = (dpeth_t *) device->specific; 259 265 // process packet queue 260 266 do{ 261 next = pq_detach( packet);267 next = pq_detach(packet); 262 268 // remove debug dump: 263 uint8_t * 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)); 269 275 } 270 276 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 * 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 281 int 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); 287 293 return ERROR_CODE; 288 294 } 289 return change_state( device, NETIF_ACTIVE);290 } 291 return EOK; 292 } 293 294 int netif_stop_message( device_ref device){295 dpeth_t * 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 300 int 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 312 int change_state(device_ref device, device_state_t state){ 307 313 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"); 309 315 return state; 310 316 } 311 317 312 int netif_initialize( void){313 ipcarg_t 314 315 async_set_interrupt_received( irq_handler);316 317 return REGISTER_ME( SERVICE_DP8390, & phonehash);318 int netif_initialize(void){ 319 ipcarg_t phonehash; 320 321 async_set_interrupt_received(irq_handler); 322 323 return REGISTER_ME(SERVICE_DP8390, &phonehash); 318 324 } 319 325
Note:
See TracChangeset
for help on using the changeset viewer.