Changeset 948911d in mainline for uspace/srv
- Timestamp:
- 2012-01-24T02:27:43Z (14 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 230385c
- Parents:
- 8afeb04 (diff), 2df6f6fe (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. - Location:
- uspace/srv
- Files:
-
- 6 added
- 3 deleted
- 31 edited
-
bd/ata_bd/ata_bd.c (modified) (1 diff)
-
bd/file_bd/file_bd.c (modified) (1 diff)
-
bd/gxe_bd/gxe_bd.c (modified) (1 diff)
-
bd/part/guid_part/guid_part.c (modified) (1 diff)
-
bd/part/mbr_part/mbr_part.c (modified) (1 diff)
-
bd/rd/rd.c (modified) (1 diff)
-
devman/devman.c (modified) (2 diffs)
-
devman/main.c (modified) (3 diffs)
-
hid/console/console.c (modified) (1 diff)
-
hid/fb/fb.c (modified) (1 diff)
-
hid/input/Makefile (modified) (2 diffs)
-
hid/input/generic/input.c (modified) (8 diffs)
-
hid/input/include/mouse.h (modified) (1 diff)
-
hid/input/include/mouse_proto.h (modified) (1 diff)
-
hid/input/port/chardev.c (modified) (1 diff)
-
hid/input/port/chardev_mouse.c (deleted)
-
hid/input/proto/adb.c (modified) (1 diff)
-
hid/input/proto/mousedev.c (modified) (1 diff)
-
hid/input/proto/ps2.c (deleted)
-
hid/remcons/Makefile (added)
-
hid/remcons/remcons.c (added)
-
hid/remcons/remcons.h (added)
-
hid/remcons/telnet.h (added)
-
hid/remcons/user.c (added)
-
hid/remcons/user.h (added)
-
hid/s3c24xx_ts/s3c24xx_ts.c (modified) (1 diff)
-
hw/bus/cuda_adb/cuda_adb.c (modified) (1 diff)
-
hw/char/i8042/i8042.c (deleted)
-
hw/char/s3c24xx_uart/s3c24xx_uart.c (modified) (1 diff)
-
loc/loc.c (modified) (8 diffs)
-
net/cfg/e1k.nic (modified) (1 diff)
-
net/cfg/lo.nic (modified) (1 diff)
-
net/cfg/ne2k.nic (modified) (1 diff)
-
net/net/Makefile (modified) (1 diff)
-
net/net/net.c (modified) (13 diffs)
-
net/net/net.h (modified) (3 diffs)
-
net/nil/eth/eth.c (modified) (11 diffs)
-
net/nil/eth/eth.h (modified) (2 diffs)
-
net/nil/nildummy/nildummy.c (modified) (12 diffs)
-
net/nil/nildummy/nildummy.h (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/bd/ata_bd/ata_bd.c
r8afeb04 r948911d 245 245 void *vaddr; 246 246 int rc; 247 248 rc = loc_server_register(NAME, ata_bd_connection); 247 248 async_set_client_connection(ata_bd_connection); 249 rc = loc_server_register(NAME); 249 250 if (rc < 0) { 250 251 printf(NAME ": Unable to register driver.\n"); -
uspace/srv/bd/file_bd/file_bd.c
r8afeb04 r948911d 141 141 int rc; 142 142 long img_size; 143 144 rc = loc_server_register(NAME, file_bd_connection); 143 144 async_set_client_connection(file_bd_connection); 145 rc = loc_server_register(NAME); 145 146 if (rc < 0) { 146 147 printf(NAME ": Unable to register driver.\n"); -
uspace/srv/bd/gxe_bd/gxe_bd.c
r8afeb04 r948911d 125 125 int rc, i; 126 126 char name[16]; 127 128 rc = loc_server_register(NAME, gxe_bd_connection); 127 128 async_set_client_connection(gxe_bd_connection); 129 rc = loc_server_register(NAME); 129 130 if (rc < 0) { 130 131 printf(NAME ": Unable to register driver.\n"); -
uspace/srv/bd/part/guid_part/guid_part.c
r8afeb04 r948911d 164 164 165 165 /* Register server with location service. */ 166 rc = loc_server_register(NAME, gpt_connection); 166 async_set_client_connection(gpt_connection); 167 rc = loc_server_register(NAME); 167 168 if (rc != EOK) { 168 169 printf(NAME ": Unable to register server.\n"); -
uspace/srv/bd/part/mbr_part/mbr_part.c
r8afeb04 r948911d 214 214 215 215 /* Register server with location service. */ 216 rc = loc_server_register(NAME, mbr_connection); 216 async_set_client_connection(mbr_connection); 217 rc = loc_server_register(NAME); 217 218 if (rc != EOK) { 218 219 printf(NAME ": Unable to register server.\n"); -
uspace/srv/bd/rd/rd.c
r8afeb04 r948911d 235 235 (void *) addr_phys, size); 236 236 237 ret = loc_server_register(NAME, rd_connection); 237 async_set_client_connection(rd_connection); 238 ret = loc_server_register(NAME); 238 239 if (ret < 0) { 239 240 printf("%s: Unable to register driver (%d)\n", NAME, ret); -
uspace/srv/devman/devman.c
r8afeb04 r948911d 794 794 case EOK: 795 795 dev->state = DEVICE_USABLE; 796 exch = async_exchange_begin(drv->sess);797 async_msg_1(exch, DRIVER_DEV_ADDED, dev->handle);798 async_exchange_end(exch);799 796 break; 800 797 case ENOENT: … … 803 800 default: 804 801 dev->state = DEVICE_INVALID; 802 break; 805 803 } 806 804 -
uspace/srv/devman/main.c
r8afeb04 r948911d 1309 1309 1310 1310 /* 1311 * !!! devman_connection ... as the device manager is not a real loc 1312 * driver (it uses a completely different ipc protocol than an ordinary 1313 * loc driver) forwarding a connection from client to the devman by 1314 * location service would not work. 1311 * Caution: As the device manager is not a real loc 1312 * driver (it uses a completely different IPC protocol 1313 * than an ordinary loc driver), forwarding a connection 1314 * from client to the devman by location service will 1315 * not work. 1315 1316 */ 1316 loc_server_register(NAME , devman_connection);1317 loc_server_register(NAME); 1317 1318 1318 1319 return true; … … 1325 1326 if (log_init(NAME, LVL_WARN) != EOK) { 1326 1327 printf(NAME ": Error initializing logging subsystem.\n"); 1327 return -1;1328 }1329 1330 if (!devman_init()) {1331 log_msg(LVL_ERROR, "Error while initializing service.");1332 1328 return -1; 1333 1329 } … … 1338 1334 async_set_client_connection(devman_connection); 1339 1335 1336 if (!devman_init()) { 1337 log_msg(LVL_ERROR, "Error while initializing service."); 1338 return -1; 1339 } 1340 1340 1341 /* Register device manager at naming service. */ 1341 1342 if (service_register(SERVICE_DEVMAN) != EOK) { -
uspace/srv/hid/console/console.c
r8afeb04 r948911d 825 825 826 826 /* Register server */ 827 int rc = loc_server_register(NAME, client_connection); 827 async_set_client_connection(client_connection); 828 int rc = loc_server_register(NAME); 828 829 if (rc < 0) { 829 830 printf("%s: Unable to register server (%s)\n", NAME, -
uspace/srv/hid/fb/fb.c
r8afeb04 r948911d 987 987 988 988 /* Register server */ 989 int rc = loc_server_register(NAME, client_connection); 989 async_set_client_connection(client_connection); 990 int rc = loc_server_register(NAME); 990 991 if (rc != EOK) { 991 992 printf("%s: Unable to register driver (%d)\n", NAME, rc); -
uspace/srv/hid/input/Makefile
r8afeb04 r948911d 43 43 port/adb_mouse.c \ 44 44 port/chardev.c \ 45 port/chardev_mouse.c \46 45 port/gxemul.c \ 47 46 port/msim.c \ … … 52 51 proto/adb.c \ 53 52 proto/mousedev.c \ 54 proto/ps2.c \55 53 ctl/apple.c \ 56 54 ctl/gxe_fb.c \ -
uspace/srv/hid/input/generic/input.c
r8afeb04 r948911d 39 39 #include <adt/list.h> 40 40 #include <bool.h> 41 #include <fibril_synch.h> 41 42 #include <ipc/services.h> 42 43 #include <ipc/input.h> … … 83 84 async_sess_t *irc_sess = NULL; 84 85 86 static FIBRIL_MUTEX_INITIALIZE(discovery_lock); 87 85 88 void kbd_push_data(kbd_dev_t *kdev, sysarg_t data) 86 89 { … … 172 175 173 176 /** Mouse pointer has moved. */ 174 void mouse_push_event_move(mouse_dev_t *mdev, int dx, int dy )177 void mouse_push_event_move(mouse_dev_t *mdev, int dx, int dy, int dz) 175 178 { 176 179 async_exch_t *exch = async_exchange_begin(client_sess); 177 async_msg_2(exch, INPUT_EVENT_MOVE, dx, dy); 180 if (dx || dy) 181 async_msg_2(exch, INPUT_EVENT_MOVE, dx, dy); 182 if (dz) { 183 // TODO: Implement proper wheel support 184 keycode_t code = dz > 0 ? KC_UP : KC_DOWN; 185 for (int i = 0; i < 3; ++i) { 186 async_msg_4(exch, INPUT_EVENT_KEY, KEY_PRESS, code, 0, 0); 187 } 188 async_msg_4(exch, INPUT_EVENT_KEY, KEY_RELEASE, code, 0, 0); 189 } 178 190 async_exchange_end(exch); 179 191 } … … 397 409 * them automatically. 398 410 */ 399 #if defined(UARCH_amd64)400 kbd_add_dev(&chardev_port, &pc_ctl);401 #endif402 411 #if defined(UARCH_arm32) && defined(MACHINE_gta02) 403 412 kbd_add_dev(&chardev_port, &stty_ctl); … … 411 420 #if defined(UARCH_arm32) && defined(MACHINE_integratorcp) 412 421 kbd_add_dev(&pl050_port, &pc_ctl); 413 #endif414 #if defined(UARCH_ia32)415 kbd_add_dev(&chardev_port, &pc_ctl);416 #endif417 #if defined(MACHINE_i460GX)418 kbd_add_dev(&chardev_port, &pc_ctl);419 422 #endif 420 423 #if defined(MACHINE_ski) … … 450 453 * them automatically. 451 454 */ 452 #if defined(UARCH_amd64)453 mouse_add_dev(&chardev_mouse_port, &ps2_proto);454 #endif455 #if defined(UARCH_ia32)456 mouse_add_dev(&chardev_mouse_port, &ps2_proto);457 #endif458 #if defined(MACHINE_i460GX)459 mouse_add_dev(&chardev_mouse_port, &ps2_proto);460 #endif461 455 #if defined(UARCH_ppc32) 462 456 mouse_add_dev(&adb_mouse_port, &adb_proto); … … 602 596 int rc; 603 597 598 fibril_mutex_lock(&discovery_lock); 599 604 600 rc = dev_check_new_kbdevs(); 605 if (rc != EOK) 601 if (rc != EOK) { 602 fibril_mutex_unlock(&discovery_lock); 606 603 return rc; 604 } 607 605 608 606 rc = dev_check_new_mousedevs(); 609 if (rc != EOK) 607 if (rc != EOK) { 608 fibril_mutex_unlock(&discovery_lock); 610 609 return rc; 611 610 } 611 612 fibril_mutex_unlock(&discovery_lock); 613 612 614 return EOK; 613 615 } … … 658 660 659 661 /* Register driver */ 660 int rc = loc_server_register(NAME, client_connection); 662 async_set_client_connection(client_connection); 663 int rc = loc_server_register(NAME); 661 664 if (rc < 0) { 662 665 printf("%s: Unable to register server (%d)\n", NAME, rc); -
uspace/srv/hid/input/include/mouse.h
r8afeb04 r948911d 62 62 63 63 extern void mouse_push_data(mouse_dev_t *, sysarg_t); 64 extern void mouse_push_event_move(mouse_dev_t *, int, int );64 extern void mouse_push_event_move(mouse_dev_t *, int, int, int); 65 65 extern void mouse_push_event_button(mouse_dev_t *, int, int); 66 66 -
uspace/srv/hid/input/include/mouse_proto.h
r8afeb04 r948911d 48 48 49 49 extern mouse_proto_ops_t adb_proto; 50 extern mouse_proto_ops_t ps2_proto;51 50 extern mouse_proto_ops_t mousedev_proto; 52 51 -
uspace/srv/hid/input/port/chardev.c
r8afeb04 r948911d 63 63 /** List of devices to try connecting to. */ 64 64 static const char *in_devs[] = { 65 "char/ps2a",66 65 "char/s3c24ser" 67 66 }; -
uspace/srv/hid/input/proto/adb.c
r8afeb04 r948911d 82 82 83 83 if (dx != 0 || dy != 0) 84 mouse_push_event_move(mouse_dev, dx, dy );84 mouse_push_event_move(mouse_dev, dx, dy, 0); 85 85 } 86 86 -
uspace/srv/hid/input/proto/mousedev.c
r8afeb04 r948911d 91 91 switch (IPC_GET_IMETHOD(call)) { 92 92 case MOUSEEV_MOVE_EVENT: 93 mouse_push_event_move(mousedev->mouse_dev, IPC_GET_ARG1(call), 94 IPC_GET_ARG2(call)); 93 mouse_push_event_move(mousedev->mouse_dev, 94 IPC_GET_ARG1(call), IPC_GET_ARG2(call), 95 IPC_GET_ARG3(call)); 95 96 retval = EOK; 96 97 break; 97 98 case MOUSEEV_BUTTON_EVENT: 98 mouse_push_event_button(mousedev->mouse_dev, IPC_GET_ARG1(call),99 IPC_GET_ARG 2(call));99 mouse_push_event_button(mousedev->mouse_dev, 100 IPC_GET_ARG1(call), IPC_GET_ARG2(call)); 100 101 retval = EOK; 101 102 break; -
uspace/srv/hid/s3c24xx_ts/s3c24xx_ts.c
r8afeb04 r948911d 85 85 86 86 printf(NAME ": S3C24xx touchscreen driver\n"); 87 88 rc = loc_server_register(NAME, s3c24xx_ts_connection); 87 88 async_set_client_connection(s3c24xx_ts_connection); 89 rc = loc_server_register(NAME); 89 90 if (rc < 0) { 90 91 printf(NAME ": Unable to register driver.\n"); -
uspace/srv/hw/bus/cuda_adb/cuda_adb.c
r8afeb04 r948911d 154 154 } 155 155 156 rc = loc_server_register(NAME, cuda_connection); 156 async_set_client_connection(cuda_connection); 157 rc = loc_server_register(NAME); 157 158 if (rc < 0) { 158 159 printf(NAME ": Unable to register server.\n"); -
uspace/srv/hw/char/s3c24xx_uart/s3c24xx_uart.c
r8afeb04 r948911d 79 79 printf(NAME ": S3C24xx on-chip UART driver\n"); 80 80 81 rc = loc_server_register(NAME, s3c24xx_uart_connection); 81 async_set_client_connection(s3c24xx_uart_connection); 82 rc = loc_server_register(NAME); 82 83 if (rc < 0) { 83 84 printf(NAME ": Unable to register server.\n"); -
uspace/srv/loc/loc.c
r8afeb04 r948911d 56 56 #define NULL_SERVICES 256 57 57 58 /** Callback session */ 59 typedef struct { 60 link_t cb_sess_list; 61 async_sess_t *sess; 62 } cb_sess_t; 63 58 64 LIST_INITIALIZE(services_list); 59 65 LIST_INITIALIZE(namespaces_list); … … 86 92 87 93 static FIBRIL_MUTEX_INITIALIZE(callback_sess_mutex); 88 static async_sess_t *callback_sess = NULL;94 static LIST_INITIALIZE(callback_sess_list); 89 95 90 96 service_id_t loc_create_id(void) … … 608 614 size_t act_size; 609 615 loc_service_t *svc; 616 char *fqn; 610 617 611 618 if (!async_data_read_receive(&callid, &size)) { … … 625 632 } 626 633 627 act_size = str_size(svc->name); 634 if (asprintf(&fqn, "%s/%s", svc->namespace->name, svc->name) < 0) { 635 fibril_mutex_unlock(&services_list_mutex); 636 async_answer_0(callid, ENOMEM); 637 async_answer_0(iid, ENOMEM); 638 return; 639 } 640 641 act_size = str_size(fqn); 628 642 if (act_size > size) { 643 free(fqn); 629 644 fibril_mutex_unlock(&services_list_mutex); 630 645 async_answer_0(callid, EOVERFLOW); … … 633 648 } 634 649 635 sysarg_t retval = async_data_read_finalize(callid, svc->name,650 sysarg_t retval = async_data_read_finalize(callid, fqn, 636 651 min(size, act_size)); 652 free(fqn); 637 653 638 654 fibril_mutex_unlock(&services_list_mutex); … … 790 806 } 791 807 792 /** Find ID for category specified by name. 793 * 794 * On success, answer will contain EOK int retval and service ID in arg1. 808 /** Create callback connection. 809 * 810 * Create callback connection which will be used to send category change 811 * events. 812 * 813 * On success, answer will contain EOK int retval. 795 814 * On failure, error code will be sent in retval. 796 *797 815 */ 798 816 static void loc_callback_create(ipc_callid_t iid, ipc_call_t *icall) 799 817 { 800 async_sess_t *cb_sess = async_callback_receive(EXCHANGE_SERIALIZE); 818 cb_sess_t *cb_sess; 819 820 cb_sess = calloc(1, sizeof(cb_sess_t)); 801 821 if (cb_sess == NULL) { 802 822 async_answer_0(iid, ENOMEM); … … 804 824 } 805 825 826 async_sess_t *sess = async_callback_receive(EXCHANGE_SERIALIZE); 827 if (sess == NULL) { 828 free(cb_sess); 829 async_answer_0(iid, ENOMEM); 830 return; 831 } 832 833 cb_sess->sess = sess; 834 link_initialize(&cb_sess->cb_sess_list); 835 806 836 fibril_mutex_lock(&callback_sess_mutex); 807 if (callback_sess != NULL) { 808 fibril_mutex_unlock(&callback_sess_mutex); 809 async_answer_0(iid, EEXIST); 810 return; 811 } 812 813 callback_sess = cb_sess; 837 list_append(&cb_sess->cb_sess_list, &callback_sess_list); 814 838 fibril_mutex_unlock(&callback_sess_mutex); 815 839 … … 820 844 { 821 845 fibril_mutex_lock(&callback_sess_mutex); 822 823 if (callback_sess != NULL) { 824 async_exch_t *exch = async_exchange_begin(callback_sess); 846 847 list_foreach(callback_sess_list, link) { 848 cb_sess_t *cb_sess; 849 850 cb_sess = list_get_instance(link, cb_sess_t, cb_sess_list); 851 852 async_exch_t *exch = async_exchange_begin(cb_sess->sess); 825 853 async_msg_0(exch, LOC_EVENT_CAT_CHANGE); 826 854 async_exchange_end(exch); 827 855 } 828 856 829 857 fibril_mutex_unlock(&callback_sess_mutex); 830 858 } -
uspace/srv/net/cfg/e1k.nic
r8afeb04 r948911d 3 3 NAME=e1k 4 4 5 HWPATH= /hw/pci0/00:03.0/port05 HWPATH=devices/\hw\pci0\00:03.0\port0 6 6 NIL=eth 7 7 IL=ip -
uspace/srv/net/cfg/lo.nic
r8afeb04 r948911d 3 3 NAME=lo 4 4 5 HWPATH= /virt/lo/port05 HWPATH=devices/\virt\lo\port0 6 6 NIL=nildummy 7 7 IL=ip -
uspace/srv/net/cfg/ne2k.nic
r8afeb04 r948911d 3 3 NAME=ne2k 4 4 5 HWPATH= /hw/pci0/00:01.0/ne2k/port05 HWPATH=devices/\hw\pci0\00:01.0\ne2k\port0 6 6 NIL=eth 7 7 IL=ip -
uspace/srv/net/net/Makefile
r8afeb04 r948911d 31 31 ROOT_PATH = $(USPACE_PREFIX)/.. 32 32 LIBS = $(LIBNET_PREFIX)/libnet.a 33 EXTRA_CFLAGS = -I$(LIBNET_PREFIX)/include 33 EXTRA_CFLAGS = -I$(LIBNET_PREFIX)/include -I$(LIBNIC_PREFIX)/include \ 34 -I$(LIBDRV_PREFIX)/include 34 35 35 36 COMMON_MAKEFILE = $(ROOT_PATH)/Makefile.common -
uspace/srv/net/net/net.c
r8afeb04 r948911d 2 2 * Copyright (c) 2009 Lukas Mejdrech 3 3 * Copyright (c) 2011 Radim Vansa 4 * Copyright (c) 2011 Jiri Svoboda 4 5 * All rights reserved. 5 6 * … … 41 42 #include <stdio.h> 42 43 #include <str.h> 43 #include <devman.h>44 44 #include <str_error.h> 45 45 #include <ns.h> … … 56 56 #include <adt/measured_strings.h> 57 57 #include <adt/module_map.h> 58 #include <fibril_synch.h> 59 #include <loc.h> 60 #include <nic.h> 58 61 #include <nil_remote.h> 59 62 #include <net_interface.h> … … 73 76 GENERIC_CHAR_MAP_IMPLEMENT(measured_strings, measured_string_t); 74 77 DEVICE_MAP_IMPLEMENT(netifs, netif_t); 78 LIST_INITIALIZE(netif_list); 79 80 static FIBRIL_MUTEX_INITIALIZE(discovery_lock); 75 81 76 82 /** Add the configured setting to the configuration map. … … 287 293 * 288 294 */ 289 static int init_device(netif_t *netif, devman_handle_t handle)295 static int init_device(netif_t *netif, service_id_t sid) 290 296 { 291 297 printf("%s: Initializing device '%s'\n", NAME, netif->name); 292 298 293 netif-> handle = handle;294 netif->sess = devman_device_connect(EXCHANGE_SERIALIZE, netif->handle,299 netif->sid = sid; 300 netif->sess = loc_service_connect(EXCHANGE_SERIALIZE, netif->sid, 295 301 IPC_FLAG_BLOCKING); 296 302 if (netif->sess == NULL) { … … 337 343 strtol((const char *) setting->value, NULL, 10) : 0; 338 344 rc = nil_device_req(netif->nil->sess, netif->id, 339 netif-> handle, mtu);345 netif->sid, mtu); 340 346 if (rc != EOK) { 341 347 printf("%s: Unable to start network interface layer\n", … … 359 365 break; 360 366 default: 367 printf("%s: Unknown service\n", NAME); 361 368 return ENOENT; 362 369 } 363 370 364 371 printf("%s: Activating device '%s'\n", NAME, netif->name); 372 list_append(&netif->netif_list, &netif_list); 365 373 return nic_set_state(netif->sess, NIC_STATE_ACTIVE); 366 374 } 367 375 368 static int net_port_ready(devman_handle_t handle) 369 { 370 char hwpath[MAX_PATH_LENGTH]; 371 int rc = devman_fun_get_path(handle, hwpath, MAX_PATH_LENGTH); 372 if (rc != EOK) 376 static int net_nic_ready(service_id_t sid) 377 { 378 int rc; 379 char *hwpath; 380 381 rc = loc_service_get_name(sid, &hwpath); 382 if (rc != EOK) { 383 printf("%s: Failed getting name of service '%u'\n", 384 NAME, (unsigned) sid); 373 385 return EINVAL; 386 } 374 387 375 388 int index = char_map_find(&net_globals.netif_hwpaths, 376 389 (uint8_t *) hwpath, 0); 377 if (index == CHAR_MAP_NULL) 390 391 if (index == CHAR_MAP_NULL) { 392 printf("%s: Service '%s' not found in map.\n", NAME, hwpath); 393 free(hwpath); 378 394 return ENOENT; 395 } 396 397 free(hwpath); 379 398 380 399 netif_t *netif = netifs_get_index(&net_globals.netifs, index); … … 382 401 return ENOENT; 383 402 384 rc = init_device(netif, handle);403 rc = init_device(netif, sid); 385 404 if (rc != EOK) 386 405 return rc; … … 391 410 392 411 netif->il->usage++; 393 394 return EOK;395 }396 397 static int net_driver_ready_local(devman_handle_t handle)398 {399 devman_handle_t *funs;400 size_t count;401 int rc = devman_dev_get_functions(handle, &funs, &count);402 if (rc != EOK)403 return rc;404 405 for (size_t i = 0; i < count; i++) {406 rc = net_port_ready(funs[i]);407 if (rc != EOK)408 return rc;409 }410 412 411 413 return EOK; … … 479 481 net_free_devices(strings, count); 480 482 return rc; 481 case NET_NET_DRIVER_READY:482 rc = net_driver_ready_local(IPC_GET_ARG1(*call));483 *answer_count = 0;484 return rc;485 483 default: 486 484 return ENOTSUP; … … 528 526 answer_call(callid, res, &answer, count); 529 527 } 528 } 529 530 static int nic_check_new(void) 531 { 532 category_id_t nic_cat; 533 service_id_t *svcs; 534 size_t count, i; 535 bool already_known; 536 int rc; 537 538 fibril_mutex_lock(&discovery_lock); 539 540 rc = loc_category_get_id(DEVICE_CATEGORY_NIC, &nic_cat, IPC_FLAG_BLOCKING); 541 if (rc != EOK) { 542 printf("%s: Failed resolving category '%s'.\n", NAME, 543 DEVICE_CATEGORY_NIC); 544 return ENOENT; 545 } 546 547 rc = loc_category_get_svcs(nic_cat, &svcs, &count); 548 if (rc != EOK) { 549 printf("%s: Failed getting list of NIC devices.\n", NAME); 550 return EIO; 551 } 552 553 for (i = 0; i < count; i++) { 554 already_known = false; 555 556 list_foreach(netif_list, link) { 557 netif_t *netif = list_get_instance(link, netif_t, netif_list); 558 if (netif->sid == svcs[i]) { 559 already_known = true; 560 break; 561 } 562 } 563 564 if (!already_known) { 565 rc = net_nic_ready(svcs[i]); 566 if (rc != EOK) { 567 printf("%s: Failed adding NIC device #%u.\n", 568 NAME, (unsigned) svcs[i]); 569 } 570 } 571 } 572 573 free(svcs); 574 fibril_mutex_unlock(&discovery_lock); 575 return EOK; 576 } 577 578 static void cat_change_cb(void) 579 { 580 (void) nic_check_new(); 581 } 582 583 static int net_start_nic_discovery(void) 584 { 585 int rc; 586 587 rc = loc_register_cat_change_cb(cat_change_cb); 588 if (rc != EOK) { 589 printf("%s: Failed registering callback for device discovery (%d).\n", 590 NAME, rc); 591 return rc; 592 } 593 594 return nic_check_new(); 530 595 } 531 596 … … 573 638 continue; 574 639 575 netif-> handle= -1;640 netif->sid = -1; 576 641 netif->sess = NULL; 577 642 … … 697 762 } 698 763 764 rc = net_start_nic_discovery(); 765 if (rc != EOK) { 766 printf("%s: Error starting NIC discovery\n", NAME); 767 pm_destroy(); 768 return rc; 769 } 770 699 771 task_retval(0); 700 772 async_manager(); -
uspace/srv/net/net/net.h
r8afeb04 r948911d 35 35 #define NET_NET_H_ 36 36 37 #include <ipc/loc.h> 37 38 #include <net/device.h> 38 39 #include <adt/char_map.h> … … 41 42 #include <adt/module_map.h> 42 43 #include <net/packet.h> 43 #include <devman.h>44 44 45 45 #define NAME "net" … … 96 96 97 97 /** Serving network interface driver module index. */ 98 devman_handle_t handle; /**< Handle for devman*/98 service_id_t sid; /**< Service ID */ 99 99 async_sess_t *sess; /**< Driver session. */ 100 100 101 101 module_t *nil; /**< Serving link layer module index. */ 102 102 module_t *il; /**< Serving internet layer module index. */ 103 104 link_t netif_list; 103 105 } netif_t; 104 106 -
uspace/srv/net/nil/eth/eth.c
r8afeb04 r948911d 48 48 #include <ipc/net.h> 49 49 #include <ipc/services.h> 50 #include <loc.h> 50 51 #include <net/modules.h> 51 52 #include <net_checksum.h> … … 169 170 INT_MAP_IMPLEMENT(eth_protos, eth_proto_t); 170 171 171 int nil_device_state_msg_local(nic_device_id_t device_id, sysarg_t state) 172 static void eth_nic_cb_connection(ipc_callid_t iid, ipc_call_t *icall, 173 void *arg); 174 175 static int eth_device_state(nic_device_id_t device_id, sysarg_t state) 172 176 { 173 177 int index; … … 226 230 * 227 231 * @param[in] device_id New device identifier. 228 * @param[in] handle Device driver handle.232 * @param[in] sid NIC service ID. 229 233 * @param[in] mtu Device maximum transmission unit. 230 234 * … … 234 238 * 235 239 */ 236 static int eth_device_message(nic_device_id_t device_id, devman_handle_t handle,240 static int eth_device_message(nic_device_id_t device_id, service_id_t sid, 237 241 size_t mtu) 238 242 { … … 259 263 device = eth_devices_find(ð_globals.devices, device_id); 260 264 if (device) { 261 if (device-> handle != handle) {265 if (device->sid != sid) { 262 266 printf("Device %d already exists\n", device->device_id); 263 267 fibril_rwlock_write_unlock(ð_globals.devices_lock); … … 298 302 299 303 device->device_id = device_id; 300 device-> handle = handle;304 device->sid = sid; 301 305 device->flags = 0; 302 306 if ((mtu > 0) && (mtu <= ETH_MAX_TAGGED_CONTENT(device->flags))) … … 335 339 336 340 /* Bind the device driver */ 337 device->sess = devman_device_connect(EXCHANGE_SERIALIZE, handle,341 device->sess = loc_service_connect(EXCHANGE_SERIALIZE, sid, 338 342 IPC_FLAG_BLOCKING); 339 343 if (device->sess == NULL) { … … 343 347 } 344 348 345 nic_connect_to_nil(device->sess, SERVICE_ETHERNET, device_id); 349 rc = nic_callback_create(device->sess, device_id, 350 eth_nic_cb_connection, NULL); 351 if (rc != EOK) { 352 fibril_rwlock_write_unlock(ð_globals.devices_lock); 353 async_hangup(device->sess); 354 free(device); 355 return EIO; 356 } 346 357 347 358 /* Get hardware address */ … … 362 373 } 363 374 364 printf("%s: Device registered (id: %d, handle: %zu: mtu: %zu, "375 printf("%s: Device registered (id: %d, sid: %zu: mtu: %zu, " 365 376 "mac: " PRIMAC ", flags: 0x%x)\n", NAME, 366 device->device_id, device-> handle, device->mtu,377 device->device_id, device->sid, device->mtu, 367 378 ARGSMAC(device->addr.address), device->flags); 368 379 … … 802 813 next = tmp; 803 814 } else { 815 nic_send_frame(device->sess, packet_get_data(next), 816 packet_get_data_length(next)); 804 817 next = pq_next(next); 805 818 } 806 819 } while (next); 807 820 808 /* Send packet queue */ 809 if (packet) 810 nic_send_message(device->sess, packet_get_id(packet)); 821 pq_release_remote(eth_globals.net_sess, packet_get_id(packet)); 811 822 812 823 fibril_rwlock_read_unlock(ð_globals.devices_lock); 813 824 return EOK; 825 } 826 827 static int eth_received(nic_device_id_t device_id) 828 { 829 void *data; 830 size_t size; 831 int rc; 832 833 rc = async_data_write_accept(&data, false, 0, 0, 0, &size); 834 if (rc != EOK) { 835 printf("%s: data_write_accept() failed\n", NAME); 836 return rc; 837 } 838 839 packet_t *packet = packet_get_1_remote(eth_globals.net_sess, size); 840 if (packet == NULL) 841 return ENOMEM; 842 843 void *pdata = packet_suffix(packet, size); 844 memcpy(pdata, data, size); 845 free(data); 846 847 return nil_received_msg_local(device_id, packet); 814 848 } 815 849 … … 921 955 922 956 return EOK; 923 case NET_NIL_DEVICE_STATE:924 nil_device_state_msg_local(IPC_GET_DEVICE(*call), IPC_GET_STATE(*call));925 async_answer_0(callid, EOK);926 return EOK;927 case NET_NIL_RECEIVED:928 rc = packet_translate_remote(eth_globals.net_sess, &packet,929 IPC_GET_ARG2(*call));930 if (rc == EOK)931 rc = nil_received_msg_local(IPC_GET_ARG1(*call), packet);932 933 async_answer_0(callid, (sysarg_t) rc);934 return rc;935 case NET_NIL_ADDR_CHANGED:936 rc = eth_addr_changed(IPC_GET_DEVICE(*call));937 async_answer_0(callid, (sysarg_t) rc);938 return rc;939 957 } 940 958 941 959 return ENOTSUP; 960 } 961 962 static void eth_nic_cb_connection(ipc_callid_t iid, ipc_call_t *icall, void *arg) 963 { 964 int rc; 965 966 async_answer_0(iid, EOK); 967 968 while (true) { 969 ipc_call_t call; 970 ipc_callid_t callid = async_get_call(&call); 971 972 if (!IPC_GET_IMETHOD(call)) 973 break; 974 975 switch (IPC_GET_IMETHOD(call)) { 976 case NIC_EV_DEVICE_STATE: 977 rc = eth_device_state(IPC_GET_ARG1(call), 978 IPC_GET_ARG2(call)); 979 async_answer_0(callid, (sysarg_t) rc); 980 break; 981 case NIC_EV_RECEIVED: 982 rc = eth_received(IPC_GET_ARG1(call)); 983 async_answer_0(callid, (sysarg_t) rc); 984 break; 985 case NIC_EV_ADDR_CHANGED: 986 rc = eth_addr_changed(IPC_GET_ARG1(call)); 987 async_answer_0(callid, (sysarg_t) rc); 988 break; 989 default: 990 async_answer_0(callid, ENOTSUP); 991 } 992 } 942 993 } 943 994 -
uspace/srv/net/nil/eth/eth.h
r8afeb04 r948911d 41 41 #include <async.h> 42 42 #include <fibril_synch.h> 43 #include <ipc/loc.h> 43 44 #include <ipc/services.h> 44 45 #include <net/device.h> 45 46 #include <adt/measured_strings.h> 46 #include <devman.h>47 47 48 48 /** Ethernet address length. */ … … 224 224 nic_device_id_t device_id; 225 225 /** Device handle */ 226 devman_handle_t handle;226 service_id_t sid; 227 227 /** Driver session. */ 228 228 async_sess_t *sess; -
uspace/srv/net/nil/nildummy/nildummy.c
r8afeb04 r948911d 2 2 * Copyright (c) 2009 Lukas Mejdrech 3 3 * Copyright (c) 2011 Radim Vansa 4 * Copyright (c) 2011 Jiri Svoboda 4 5 * All rights reserved. 5 6 * … … 53 54 #include <packet_remote.h> 54 55 #include <packet_client.h> 55 #include <devman.h>56 56 #include <device/nic.h> 57 #include <loc.h> 57 58 #include <nil_skel.h> 58 59 #include "nildummy.h" … … 69 70 DEVICE_MAP_IMPLEMENT(nildummy_devices, nildummy_device_t); 70 71 71 int nil_device_state_msg_local(nic_device_id_t device_id, sysarg_t state) 72 static void nildummy_nic_cb_conn(ipc_callid_t iid, ipc_call_t *icall, 73 void *arg); 74 75 static int nildummy_device_state(nic_device_id_t device_id, sysarg_t state) 72 76 { 73 77 fibril_rwlock_read_lock(&nildummy_globals.protos_lock); … … 78 82 79 83 return EOK; 84 } 85 86 static int nildummy_addr_changed(nic_device_id_t device_id) 87 { 88 return ENOTSUP; 80 89 } 81 90 … … 115 124 */ 116 125 static int nildummy_device_message(nic_device_id_t device_id, 117 devman_handle_t handle, size_t mtu)126 service_id_t sid, size_t mtu) 118 127 { 119 128 fibril_rwlock_write_lock(&nildummy_globals.devices_lock); … … 123 132 nildummy_devices_find(&nildummy_globals.devices, device_id); 124 133 if (device) { 125 if (device-> handle != handle) {134 if (device->sid != sid) { 126 135 printf("Device %d exists, handles do not match\n", 127 136 device->device_id); … … 158 167 159 168 device->device_id = device_id; 160 device-> handle = handle;169 device->sid = sid; 161 170 if (mtu > 0) 162 171 device->mtu = mtu; … … 165 174 166 175 /* Bind the device driver */ 167 device->sess = devman_device_connect(EXCHANGE_SERIALIZE, handle,176 device->sess = loc_service_connect(EXCHANGE_SERIALIZE, sid, 168 177 IPC_FLAG_BLOCKING); 169 178 if (device->sess == NULL) { … … 173 182 } 174 183 175 nic_connect_to_nil(device->sess, SERVICE_NILDUMMY, device_id); 184 int rc = nic_callback_create(device->sess, device_id, 185 nildummy_nic_cb_conn, NULL); 186 if (rc != EOK) { 187 async_hangup(device->sess); 188 189 return ENOENT; 190 } 176 191 177 192 /* Get hardware address */ 178 intrc = nic_get_address(device->sess, &device->addr);193 rc = nic_get_address(device->sess, &device->addr); 179 194 if (rc != EOK) { 180 195 fibril_rwlock_write_unlock(&nildummy_globals.devices_lock); … … 345 360 services_t sender) 346 361 { 362 packet_t *p; 363 347 364 fibril_rwlock_read_lock(&nildummy_globals.devices_lock); 348 365 … … 354 371 } 355 372 356 /* Send packet queue */ 357 if (packet) 358 nic_send_message(device->sess, packet_get_id(packet)); 373 p = packet; 374 do { 375 nic_send_frame(device->sess, packet_get_data(p), 376 packet_get_data_length(p)); 377 p = pq_next(p); 378 } while (p != NULL); 379 380 pq_release_remote(nildummy_globals.net_sess, packet_get_id(packet)); 359 381 360 382 fibril_rwlock_read_unlock(&nildummy_globals.devices_lock); 361 383 362 384 return EOK; 385 } 386 387 static int nildummy_received(nic_device_id_t device_id) 388 { 389 void *data; 390 size_t size; 391 int rc; 392 393 rc = async_data_write_accept(&data, false, 0, 0, 0, &size); 394 if (rc != EOK) 395 return rc; 396 397 packet_t *packet = packet_get_1_remote(nildummy_globals.net_sess, size); 398 if (packet == NULL) 399 return ENOMEM; 400 401 void *pdata = packet_suffix(packet, size); 402 memcpy(pdata, data, size); 403 free(pdata); 404 405 return nil_received_msg_local(device_id, packet); 363 406 } 364 407 … … 417 460 *answer_count = 1; 418 461 return rc; 419 case NET_NIL_DEVICE_STATE:420 rc = nil_device_state_msg_local(IPC_GET_DEVICE(*call),421 IPC_GET_STATE(*call));422 async_answer_0(callid, (sysarg_t) rc);423 return rc;424 425 case NET_NIL_RECEIVED:426 rc = packet_translate_remote(nildummy_globals.net_sess, &packet,427 IPC_GET_ARG2(*call));428 if (rc == EOK)429 rc = nil_received_msg_local(IPC_GET_ARG1(*call), packet);430 431 async_answer_0(callid, (sysarg_t) rc);432 return rc;433 462 } 434 463 435 464 return ENOTSUP; 436 465 } 466 467 static void nildummy_nic_cb_conn(ipc_callid_t iid, ipc_call_t *icall, void *arg) 468 { 469 int rc; 470 471 async_answer_0(iid, EOK); 472 473 while (true) { 474 ipc_call_t call; 475 ipc_callid_t callid = async_get_call(&call); 476 477 if (!IPC_GET_IMETHOD(call)) 478 break; 479 480 switch (IPC_GET_IMETHOD(call)) { 481 case NIC_EV_DEVICE_STATE: 482 rc = nildummy_device_state(IPC_GET_ARG1(call), 483 IPC_GET_ARG2(call)); 484 async_answer_0(callid, (sysarg_t) rc); 485 break; 486 case NIC_EV_RECEIVED: 487 rc = nildummy_received(IPC_GET_ARG1(call)); 488 async_answer_0(callid, (sysarg_t) rc); 489 break; 490 case NIC_EV_ADDR_CHANGED: 491 rc = nildummy_addr_changed(IPC_GET_ARG1(call)); 492 async_answer_0(callid, (sysarg_t) rc); 493 break; 494 default: 495 async_answer_0(callid, ENOTSUP); 496 } 497 } 498 } 499 437 500 438 501 int main(int argc, char *argv[]) -
uspace/srv/net/nil/nildummy/nildummy.h
r8afeb04 r948911d 41 41 #include <async.h> 42 42 #include <fibril_synch.h> 43 #include <ipc/loc.h> 43 44 #include <ipc/services.h> 44 #include <ipc/devman.h>45 45 #include <net/device.h> 46 46 … … 78 78 /** Device identifier. */ 79 79 nic_device_id_t device_id; 80 /** Device driver handle. */81 devman_handle_t handle;80 /** Device service ID. */ 81 service_id_t sid; 82 82 /** Driver session. */ 83 83 async_sess_t *sess;
Note:
See TracChangeset
for help on using the changeset viewer.
