Changes in / [c01255c:98d06b8] in mainline
- Files:
-
- 4 added
- 25 deleted
- 49 edited
Legend:
- Unmodified
- Added
- Removed
-
.bzrignore
rc01255c r98d06b8 62 62 ./uspace/app/trace/trace 63 63 ./uspace/app/usb/usb 64 ./uspace/app/usbinfo/usbinfo65 64 ./uspace/app/virtusbkbd/vuk 66 ./uspace/dist/app/* 65 ./uspace/dist/app/bdsh 66 ./uspace/dist/app/edit 67 ./uspace/dist/app/getterm 68 ./uspace/dist/app/klog 69 ./uspace/dist/app/mkfat 70 ./uspace/dist/app/netecho 71 ./uspace/dist/app/netstart 72 ./uspace/dist/app/nettest1 73 ./uspace/dist/app/nettest2 74 ./uspace/dist/app/ping 75 ./uspace/dist/app/redir 76 ./uspace/dist/app/sbi 77 ./uspace/dist/app/stats 78 ./uspace/dist/app/taskdump 79 ./uspace/dist/app/tasks 80 ./uspace/dist/app/tester 81 ./uspace/dist/app/test_serial 82 ./uspace/dist/app/tetris 83 ./uspace/dist/app/top 84 ./uspace/dist/app/trace 85 ./uspace/dist/app/usb 86 ./uspace/dist/app/vuk 67 87 ./uspace/dist/cfg/net/general 68 88 ./uspace/dist/cfg/net/lo 69 89 ./uspace/dist/cfg/net/ne2k 70 ./uspace/dist/drv/* 71 ./uspace/dist/srv/* 90 ./uspace/dist/drv/isa/ 91 ./uspace/dist/drv/ns8250/ 92 ./uspace/dist/drv/pciintel/ 93 ./uspace/dist/drv/root/ 94 ./uspace/dist/drv/rootia32/ 95 ./uspace/dist/drv/uhci/ 96 ./uspace/dist/drv/usbhub/ 97 ./uspace/dist/drv/usbkbd/ 98 ./uspace/dist/drv/vhc/ 99 ./uspace/dist/srv/arp 100 ./uspace/dist/srv/ata_bd 101 ./uspace/dist/srv/char_ms 102 ./uspace/dist/srv/clip 103 ./uspace/dist/srv/console 104 ./uspace/dist/srv/devfs 105 ./uspace/dist/srv/devman 106 ./uspace/dist/srv/dp8390 107 ./uspace/dist/srv/eth 108 ./uspace/dist/srv/fat 109 ./uspace/dist/srv/fb 110 ./uspace/dist/srv/file_bd 111 ./uspace/dist/srv/g_part 112 ./uspace/dist/srv/i8042 113 ./uspace/dist/srv/icmp 114 ./uspace/dist/srv/ip 115 ./uspace/dist/srv/kbd 116 ./uspace/dist/srv/lo 117 ./uspace/dist/srv/mbr_part 118 ./uspace/dist/srv/net 119 ./uspace/dist/srv/netstart 120 ./uspace/dist/srv/nildummy 121 ./uspace/dist/srv/pci 122 ./uspace/dist/srv/taskmon 123 ./uspace/dist/srv/tcp 124 ./uspace/dist/srv/tmpfs 125 ./uspace/dist/srv/udp 126 ./uspace/dist/srv/vhcd 72 127 ./uspace/drv/root/root 73 128 ./uspace/drv/isa/isa 74 129 ./uspace/drv/ns8250/ns8250 75 130 ./uspace/drv/pciintel/pciintel 76 ./uspace/drv/rootpc/rootpc 77 ./uspace/drv/rootvirt/rootvirt 78 ./uspace/drv/test1/test1 79 ./uspace/drv/test2/test2 131 ./uspace/drv/rootia32/rootia32 80 132 ./uspace/drv/uhci/uhci 81 133 ./uspace/drv/usbhub/usbhub -
HelenOS.config
rc01255c r98d06b8 545 545 % Line debugging information 546 546 ! [CONFIG_STRIP_BINARIES!=y] CONFIG_LINE_DEBUG (n/y) 547 548 % Launch (devman) test drivers549 ! [CONFIG_DEBUG=y] CONFIG_TEST_DRIVERS (y/n)550 -
Makefile
rc01255c r98d06b8 41 41 CONFIG_HEADER = config.h 42 42 43 .PHONY: all precheck cscope autotool config_ auto config_default config distclean clean43 .PHONY: all precheck cscope autotool config_default config distclean clean 44 44 45 45 all: $(COMMON_MAKEFILE) $(COMMON_HEADER) $(CONFIG_MAKEFILE) $(CONFIG_HEADER) … … 66 66 67 67 config_default: $(CONFIG_RULES) 68 ifeq ($(HANDS_OFF),y) 69 $(CONFIG) $< hands-off $(PROFILE) 70 else 71 $(CONFIG) $< default $(PROFILE) 72 endif 68 $(CONFIG) $< default 73 69 74 70 config: $(CONFIG_RULES) -
boot/Makefile.common
rc01255c r98d06b8 111 111 RD_DRVS = \ 112 112 root \ 113 rootvirt \114 test1 \115 test2 \116 113 vhc 117 114 … … 145 142 $(USPACE_PATH)/app/ping/ping \ 146 143 $(USPACE_PATH)/app/stats/stats \ 144 $(USPACE_PATH)/app/virtusbkbd/vuk \ 147 145 $(USPACE_PATH)/app/tasks/tasks \ 148 $(USPACE_PATH)/app/top/top \ 149 $(USPACE_PATH)/app/usbinfo/usbinfo \ 150 $(USPACE_PATH)/app/virtusbkbd/vuk 146 $(USPACE_PATH)/app/top/top 151 147 152 148 ifneq ($(CONFIG_BAREBONE),y) -
boot/arch/amd64/Makefile.inc
rc01255c r98d06b8 37 37 38 38 RD_DRVS += \ 39 root pc\39 rootia32 \ 40 40 pciintel \ 41 41 isa \ -
tools/config.py
rc01255c r98d06b8 47 47 48 48 def read_config(fname, config): 49 "Read saved values from last configuration run or a preset file"49 "Read saved values from last configuration run" 50 50 51 51 inf = open(fname, 'r') … … 218 218 # and verify that all variables have a value (previously specified or inferred). 219 219 # 220 # @param config 221 # @param rules 222 # 223 # @return 224 # 220 # @param config Configuration to work on 221 # @param rules Rules 222 # 223 # @return True if configuration is complete and valid, False 224 # otherwise. 225 225 # 226 226 def infer_verify_choices(config, rules): … … 229 229 for rule in rules: 230 230 varname, vartype, name, choices, cond = rule 231 231 232 232 if cond and (not check_condition(cond, config, rules)): 233 233 continue … … 237 237 else: 238 238 value = config[varname] 239 240 if not validate_rule_value(rule, value):239 240 if not rule_value_is_valid(rule, value): 241 241 value = None 242 243 default = get_default_rule(rule) 244 245 # 246 # If we don't have a value but we do have 247 # a default, use it. 248 # 249 if value == None and default != None: 250 value = default 242 243 default = rule_get_default(rule) 244 if default != None: 251 245 config[varname] = default 252 246 253 247 if not varname in config: 254 248 return False … … 257 251 258 252 ## Get default value from a rule. 259 def get_default_rule(rule):253 def rule_get_default(rule): 260 254 varname, vartype, name, choices, cond = rule 261 255 262 256 default = None 263 257 264 258 if vartype == 'choice': 265 259 # If there is just one option, use it … … 276 270 else: 277 271 raise RuntimeError("Unknown variable type: %s" % vartype) 278 272 279 273 return default 280 274 281 275 ## Get option from a rule. 282 276 # 283 # @param rule 284 # @param value 277 # @param rule Rule for a variable 278 # @param value Current value of the variable 285 279 # 286 280 # @return Option (string) to ask or None which means not to ask. 287 281 # 288 def get_rule_option(rule, value):282 def rule_get_option(rule, value): 289 283 varname, vartype, name, choices, cond = rule 290 284 291 285 option = None 292 286 293 287 if vartype == 'choice': 294 288 # If there is just one option, don't ask … … 308 302 else: 309 303 raise RuntimeError("Unknown variable type: %s" % vartype) 310 304 311 305 return option 312 306 313 307 ## Check if variable value is valid. 314 308 # 315 # @param rule 316 # @param value 317 # 318 # @return 319 # 320 def validate_rule_value(rule, value):309 # @param rule Rule for the variable 310 # @param value Value of the variable 311 # 312 # @return True if valid, False if not valid. 313 # 314 def rule_value_is_valid(rule, value): 321 315 varname, vartype, name, choices, cond = rule 322 316 323 317 if value == None: 324 318 return True 325 319 326 320 if vartype == 'choice': 327 321 if not value in [choice[0] for choice in choices]: … … 341 335 else: 342 336 raise RuntimeError("Unknown variable type: %s" % vartype) 343 337 344 338 return True 345 339 … … 419 413 return list 420 414 421 ## Ask user to choose a configuration profile.422 # 423 def choose_profile(root, fname, screen, config):415 ## Choose a profile and load configuration presets. 416 # 417 def load_presets(root, fname, screen, config): 424 418 options = [] 425 419 opt2path = {} … … 442 436 subprofile = True 443 437 options.append("%s (%s)" % (name, subname)) 444 opt2path[cnt] = [name, subname]438 opt2path[cnt] = (canon, subcanon) 445 439 cnt += 1 446 440 447 441 if not subprofile: 448 442 options.append(name) 449 opt2path[cnt] = [name]443 opt2path[cnt] = (canon, None) 450 444 cnt += 1 451 445 … … 455 449 return None 456 450 457 return opt2path[value] 458 459 ## Read presets from a configuration profile. 460 # 461 # @param profile Profile to load from (a list of string components) 462 # @param config Output configuration 463 # 464 def read_presets(profile, config): 465 path = os.path.join(PRESETS_DIR, profile[0], MAKEFILE) 466 read_config(path, config) 467 468 if len(profile) > 1: 469 path = os.path.join(PRESETS_DIR, profile[0], profile[1], MAKEFILE) 470 read_config(path, config) 471 472 ## Parse profile name (relative OS path) into a list of components. 473 # 474 # @param profile_name Relative path (using OS separator) 475 # @return List of components 476 # 477 def parse_profile_name(profile_name): 478 profile = [] 479 480 head, tail = os.path.split(profile_name) 481 if head != '': 482 profile.append(head) 483 484 profile.append(tail) 485 return profile 451 read_config(opt2path[value][0], config) 452 if opt2path[value][1] != None: 453 read_config(opt2path[value][1], config) 486 454 487 455 def main(): 488 profile = None489 456 config = {} 490 457 rules = [] … … 493 460 parse_rules(RULES_FILE, rules) 494 461 495 # Input configuration file can be specified on command line 496 # otherwise configuration from previous run is used. 497 if len(sys.argv) >= 4: 498 profile = parse_profile_name(sys.argv[3]) 499 read_presets(profile, config) 500 elif os.path.exists(MAKEFILE): 462 # Read configuration from previous run 463 if os.path.exists(MAKEFILE): 501 464 read_config(MAKEFILE, config) 502 465 503 # Default mode: check values and regenerate configuration files466 # Default mode: only check values and regenerate configuration files 504 467 if (len(sys.argv) >= 3) and (sys.argv[2] == 'default'): 505 468 if (infer_verify_choices(config, rules)): 506 469 create_output(MAKEFILE, MACROS, config, rules) 507 470 return 0 508 509 # Hands-off mode: check values and regenerate configuration files,510 # but no interactive fallback511 if (len(sys.argv) >= 3) and (sys.argv[2] == 'hands-off'):512 # We deliberately test sys.argv >= 4 because we do not want513 # to read implicitly any possible previous run configuration514 if len(sys.argv) < 4:515 sys.stderr.write("Configuration error: No presets specified\n")516 return 2517 518 if (infer_verify_choices(config, rules)):519 create_output(MAKEFILE, MACROS, config, rules)520 return 0521 522 sys.stderr.write("Configuration error: The presets are ambiguous\n")523 return 1524 471 525 472 # Check mode: only check configuration … … 560 507 value = config[varname] 561 508 562 if not validate_rule_value(rule, value):509 if not rule_value_is_valid(rule, value): 563 510 value = None 564 565 default = get_default_rule(rule) 566 567 # 568 # If we don't have a value but we do have 569 # a default, use it. 570 # 571 if value == None and default != None: 511 512 default = rule_get_default(rule) 513 if default != None: 572 514 value = default 573 515 config[varname] = default 574 575 option = get_rule_option(rule, value)516 517 option = rule_get_option(rule, value) 576 518 if option != None: 577 519 options.append(option) 578 else:579 continue580 520 581 521 opt2row[cnt] = (varname, vartype, name, choices) … … 599 539 600 540 if value == 0: 601 profile = choose_profile(PRESETS_DIR, MAKEFILE, screen, config) 602 if profile != None: 603 read_presets(profile, config) 541 load_presets(PRESETS_DIR, MAKEFILE, screen, config) 604 542 position = 1 605 543 continue -
uspace/Makefile
rc01255c r98d06b8 49 49 app/trace \ 50 50 app/top \ 51 app/usbinfo \52 51 app/virtusbkbd \ 53 52 app/netecho \ … … 88 87 srv/net/net \ 89 88 drv/root \ 90 drv/rootvirt \91 drv/test1 \92 drv/test2 \93 89 drv/vhc 94 90 … … 114 110 115 111 ifeq ($(UARCH),amd64) 116 DIRS += drv/rootpc117 DIRS += drv/pciintel118 DIRS += drv/isa119 DIRS += drv/ns8250120 112 endif 121 113 122 114 ifeq ($(UARCH),ia32) 123 DIRS += drv/root pc115 DIRS += drv/rootia32 124 116 DIRS += drv/pciintel 125 117 DIRS += drv/isa -
uspace/app/netecho/print_error.c
rc01255c r98d06b8 164 164 case EDESTADDRREQ: 165 165 fprintf(output, "Destination address required (%d) error", error_code); 166 case EAGAIN:166 case TRY_AGAIN: 167 167 fprintf(output, "Try again (%d) error", error_code); 168 168 default: -
uspace/app/tester/Makefile
rc01255c r98d06b8 31 31 BINARY = tester 32 32 33 LIBS += $(LIBUSB_PREFIX)/libusb.a34 EXTRA_CFLAGS += -I$(LIBUSB_PREFIX)/include35 36 33 SOURCES = \ 37 34 tester.c \ 38 adt/usbaddrkeep.c \39 35 thread/thread1.c \ 40 36 print/print1.c \ -
uspace/app/tester/tester.c
rc01255c r98d06b8 65 65 #include "mm/malloc1.def" 66 66 #include "hw/serial/serial1.def" 67 #include "adt/usbaddrkeep.def"68 67 {NULL, NULL, NULL, false} 69 68 }; -
uspace/app/tester/tester.h
rc01255c r98d06b8 82 82 extern const char *test_malloc1(void); 83 83 extern const char *test_serial1(void); 84 extern const char *test_usbaddrkeep(void);85 84 86 85 extern test_t tests[]; -
uspace/drv/isa/isa.c
rc01255c r98d06b8 282 282 283 283 printf(NAME ": added io range (addr=0x%x, size=0x%x) to " 284 "device %s\n", (unsigned int) addr, (unsigned int) len, 285 dev->name); 284 "device %s\n", addr, len, dev->name); 286 285 } 287 286 } … … 490 489 static int isa_add_device(device_t *dev) 491 490 { 492 printf(NAME ": isa_add_device, device handle = %d\n", 493 (int) dev->handle); 491 printf(NAME ": isa_add_device, device handle = %d\n", dev->handle); 494 492 495 493 /* Add child devices. */ -
uspace/drv/ns8250/ns8250.c
rc01255c r98d06b8 274 274 275 275 /* Gain control over port's registers. */ 276 if (pio_enable((void *) (uintptr_t)data->io_addr, REG_COUNT,276 if (pio_enable((void *) data->io_addr, REG_COUNT, 277 277 (void **) &data->port)) { 278 278 printf(NAME ": error - cannot gain the port %#" PRIx32 " for device " … … 727 727 { 728 728 printf(NAME ": ns8250_add_device %s (handle = %d)\n", 729 dev->name, (int)dev->handle);729 dev->name, dev->handle); 730 730 731 731 int res = ns8250_dev_initialize(dev); -
uspace/drv/pciintel/pci.c
rc01255c r98d06b8 324 324 printf(NAME ": device %s : ", dev->name); 325 325 printf("address = %" PRIx64, range_addr); 326 printf(", size = %x\n", (unsigned int)range_size);326 printf(", size = %x\n", range_size); 327 327 } 328 328 … … 489 489 (uint32_t) hw_resources.resources[0].res.io_range.address; 490 490 491 if (pio_enable((void *) (uintptr_t)bus_data->conf_io_addr, 8,491 if (pio_enable((void *)bus_data->conf_io_addr, 8, 492 492 &bus_data->conf_addr_port)) { 493 493 printf(NAME ": failed to enable configuration ports.\n"); -
uspace/drv/root/root.c
rc01255c r98d06b8 1 1 /* 2 2 * Copyright (c) 2010 Lenka Trochtova 3 * Copyright (c) 2010 Vojtech Horky4 3 * All rights reserved. 5 4 * … … 54 53 #define NAME "root" 55 54 56 #define PLATFORM_DEVICE_NAME "hw"57 #define PLATFORM_DEVICE_MATCH_ID STRING(UARCH)58 #define PLATFORM_DEVICE_MATCH_SCORE 10059 60 #define VIRTUAL_DEVICE_NAME "virt"61 #define VIRTUAL_DEVICE_MATCH_ID "rootvirt"62 #define VIRTUAL_DEVICE_MATCH_SCORE 10063 64 55 static int root_add_device(device_t *dev); 65 56 … … 75 66 }; 76 67 77 /** Create the device which represents the root of virtual device tree.78 *79 * @param parent Parent of the newly created device.80 * @return Error code.81 */82 static int add_virtual_root_child(device_t *parent)83 {84 printf(NAME ": adding new child for virtual devices.\n");85 printf(NAME ": device node is `%s' (%d %s)\n", VIRTUAL_DEVICE_NAME,86 VIRTUAL_DEVICE_MATCH_SCORE, VIRTUAL_DEVICE_MATCH_ID);87 88 int res = child_device_register_wrapper(parent, VIRTUAL_DEVICE_NAME,89 VIRTUAL_DEVICE_MATCH_ID, VIRTUAL_DEVICE_MATCH_SCORE);90 91 return res;92 }93 94 68 /** Create the device which represents the root of HW device tree. 95 69 * … … 100 74 { 101 75 printf(NAME ": adding new child for platform device.\n"); 102 printf(NAME ": device node is `%s' (%d %s)\n", PLATFORM_DEVICE_NAME, 103 PLATFORM_DEVICE_MATCH_SCORE, PLATFORM_DEVICE_MATCH_ID); 104 105 int res = child_device_register_wrapper(parent, PLATFORM_DEVICE_NAME, 106 PLATFORM_DEVICE_MATCH_ID, PLATFORM_DEVICE_MATCH_SCORE); 107 76 77 int res = EOK; 78 device_t *platform = NULL; 79 match_id_t *match_id = NULL; 80 81 /* Create new device. */ 82 platform = create_device(); 83 if (NULL == platform) { 84 res = ENOMEM; 85 goto failure; 86 } 87 88 platform->name = "hw"; 89 printf(NAME ": the new device's name is %s.\n", platform->name); 90 91 /* Initialize match id list. */ 92 match_id = create_match_id(); 93 if (NULL == match_id) { 94 res = ENOMEM; 95 goto failure; 96 } 97 98 /* TODO - replace this with some better solution (sysinfo ?) */ 99 match_id->id = STRING(UARCH); 100 match_id->score = 100; 101 add_match_id(&platform->match_ids, match_id); 102 103 /* Register child device. */ 104 res = child_device_register(platform, parent); 105 if (EOK != res) 106 goto failure; 107 108 108 return res; 109 110 failure: 111 if (NULL != match_id) 112 match_id->id = NULL; 113 114 if (NULL != platform) { 115 platform->name = NULL; 116 delete_device(platform); 117 } 118 119 return res; 120 } 121 122 /** Create virtual USB host controller device. 123 * Note that the virtual HC is actually device and driver in one 124 * task. 125 * 126 * @param parent Parent device. 127 * @return Error code. 128 */ 129 static int add_virtual_usb_host_controller(device_t *parent) 130 { 131 printf(NAME ": adding virtual host contoller.\n"); 132 133 int rc; 134 device_t *vhc = NULL; 135 match_id_t *match_id = NULL; 136 137 vhc = create_device(); 138 if (vhc == NULL) { 139 rc = ENOMEM; 140 goto failure; 141 } 142 143 vhc->name = "vhc"; 144 printf(NAME ": the new device's name is %s.\n", vhc->name); 145 146 /* Initialize match id list. */ 147 match_id = create_match_id(); 148 if (match_id == NULL) { 149 rc = ENOMEM; 150 goto failure; 151 } 152 153 match_id->id = "usb&hc=vhc"; 154 match_id->score = 100; 155 add_match_id(&vhc->match_ids, match_id); 156 157 /* Register child device. */ 158 rc = child_device_register(vhc, parent); 159 if (rc != EOK) 160 goto failure; 161 162 return EOK; 163 164 failure: 165 if (match_id != NULL) 166 match_id->id = NULL; 167 168 if (vhc != NULL) { 169 vhc->name = NULL; 170 delete_device(vhc); 171 } 172 173 return rc; 109 174 } 110 175 … … 119 184 dev->handle); 120 185 121 /*122 * Register virtual devices root.123 * We ignore error occurrence because virtual devices shall not be124 * vital for the system.125 */126 add_virtual_root_child(dev);127 128 186 /* Register root device's children. */ 129 187 int res = add_platform_child(dev); … … 131 189 printf(NAME ": failed to add child device for platform.\n"); 132 190 191 /* Register virtual USB host controller. */ 192 int rc = add_virtual_usb_host_controller(dev); 193 if (EOK != rc) { 194 printf(NAME ": failed to add child device - virtual USB HC.\n"); 195 } 196 133 197 return res; 134 198 } -
uspace/drv/uhci/main.c
rc01255c r98d06b8 27 27 */ 28 28 #include <usb/hcdhubd.h> 29 #include <usb/debug.h>30 29 #include <errno.h> 31 30 #include "uhci.h" … … 37 36 static int uhci_add_device(device_t *device) 38 37 { 39 usb_dprintf(NAME, 1, "uhci_add_device() called\n");40 38 device->ops = &uhci_ops; 41 39 … … 43 41 * We need to announce the presence of our root hub. 44 42 */ 45 usb_dprintf(NAME, 2, "adding root hub\n");46 43 usb_hcd_add_root_hub(device); 47 44 … … 64 61 */ 65 62 sleep(5); 66 usb_dprintf_enable(NAME, 5);67 63 68 64 return driver_main(&uhci_driver); -
uspace/drv/vhc/Makefile
rc01255c r98d06b8 39 39 40 40 SOURCES = \ 41 addrmgm.c \ 41 42 conndev.c \ 42 43 connhost.c \ -
uspace/drv/vhc/conn.h
rc01255c r98d06b8 48 48 49 49 void address_init(void); 50 int reserve_default_address(device_t *); 51 int release_default_address(device_t *); 52 int request_address(device_t *, usb_address_t *); 53 int release_address(device_t *, usb_address_t); 54 int bind_address(device_t *, usb_address_t, devman_handle_t); 50 55 56 int tell_address(device_t *, devman_handle_t, usb_address_t *); 51 57 52 58 void default_connection_handler(device_t *, ipc_callid_t, ipc_call_t *); -
uspace/drv/vhc/connhost.c
rc01255c r98d06b8 36 36 #include <errno.h> 37 37 #include <usb/usb.h> 38 #include <usb/hcd.h>39 38 40 39 #include "vhcd.h" … … 58 57 case USB_DIRECTION_IN: 59 58 transfer->in_callback(transfer->dev, 60 outcome, size,59 size, outcome, 61 60 transfer->arg); 62 61 break; … … 219 218 } 220 219 221 static usb_address_keeping_t addresses;222 223 224 static int reserve_default_address(device_t *dev)225 {226 usb_address_keeping_reserve_default(&addresses);227 return EOK;228 }229 230 static int release_default_address(device_t *dev)231 {232 usb_address_keeping_release_default(&addresses);233 return EOK;234 }235 236 static int request_address(device_t *dev, usb_address_t *address)237 {238 usb_address_t addr = usb_address_keeping_request(&addresses);239 if (addr < 0) {240 return (int)addr;241 }242 243 *address = addr;244 return EOK;245 }246 247 static int release_address(device_t *dev, usb_address_t address)248 {249 return usb_address_keeping_release(&addresses, address);250 }251 252 static int bind_address(device_t *dev, usb_address_t address,253 devman_handle_t handle)254 {255 usb_address_keeping_devman_bind(&addresses, address, handle);256 return EOK;257 }258 259 static int tell_address(device_t *dev, devman_handle_t handle,260 usb_address_t *address)261 {262 usb_address_t addr = usb_address_keeping_find(&addresses, handle);263 if (addr < 0) {264 return addr;265 }266 267 *address = addr;268 return EOK;269 }270 271 void address_init(void)272 {273 usb_address_keeping_init(&addresses, 50);274 }275 220 276 221 usbhc_iface_t vhc_iface = { -
uspace/drv/vhc/debug.c
rc01255c r98d06b8 35 35 #include <stdio.h> 36 36 #include <ipc/ipc.h> 37 #include <usb/debug.h>38 37 39 38 #include "vhcd.h" 40 39 40 /** Current debug level. */ 41 int debug_level = 0; 42 43 /** Debugging printf. 44 * This function is intended for single-line messages as it 45 * automatically prints debugging prefix at the beginning of the 46 * line. 47 * 48 * @see printf 49 * @param level Debugging level. 50 */ 51 void dprintf(int level, const char *format, ...) 52 { 53 if (level > debug_level) { 54 return; 55 } 56 57 printf("%s(%d): ", NAME, level); 58 va_list args; 59 va_start(args, format); 60 vprintf(format, args); 61 va_end(args); 62 printf("\n"); 63 } 41 64 42 65 /** Debug print informing of invalid call. -
uspace/drv/vhc/hcd.c
rc01255c r98d06b8 111 111 printf("%s: virtual USB host controller driver.\n", NAME); 112 112 113 usb_dprintf_enable(NAME, 10);113 debug_level = 10; 114 114 115 115 fid_t fid = fibril_create(hc_manager_fibril, NULL); -
uspace/drv/vhc/vhcd.h
rc01255c r98d06b8 36 36 #define VHCD_VHCD_H_ 37 37 38 #include <usb/debug.h>39 40 38 #define NAME "vhc" 41 39 #define NAME_DEV "hcd-virt-dev" … … 45 43 #define DEVMAP_PATH_DEV NAMESPACE "/" NAME_DEV 46 44 47 #define dprintf(level, format, ...) \ 48 usb_dprintf(NAME, (level), format "\n", ##__VA_ARGS__) 45 extern int debug_level; 46 void dprintf(int, const char *, ...); 49 47 void dprintf_inval_call(int, ipc_call_t, ipcarg_t); 50 48 -
uspace/lib/c/generic/adt/char_map.c
rc01255c r98d06b8 90 90 } 91 91 92 map->items[map->next]->c = * identifier;93 identifier++;94 map->next++;95 if ((length > 1) || ((length == 0) && *identifier)) {92 map->items[map->next]->c = * identifier; 93 ++ identifier; 94 ++ map->next; 95 if ((length > 1) || ((length == 0) && (*identifier))) { 96 96 map->items[map->next - 1]->value = CHAR_MAP_NULL; 97 97 return char_map_add_item(map->items[map->next - 1], identifier, … … 142 142 const int value) 143 143 { 144 if (char_map_is_valid(map) && identifier && (length || *identifier)) { 144 if (char_map_is_valid(map) && (identifier) && 145 ((length) || (*identifier))) { 145 146 int index; 146 147 147 for (index = 0; index < map->next; index++) {148 for (index = 0; index < map->next; ++ index) { 148 149 if (map->items[index]->c != *identifier) 149 150 continue; 150 151 151 identifier++;152 if((length > 1) || ((length == 0) && *identifier)) {152 ++ identifier; 153 if((length > 1) || ((length == 0) && (*identifier))) { 153 154 return char_map_add(map->items[index], 154 155 identifier, length ? length - 1 : 0, value); … … 177 178 178 179 map->magic = 0; 179 for (index = 0; index < map->next; index++)180 for (index = 0; index < map->next; ++index) 180 181 char_map_destroy(map->items[index]); 181 182 … … 206 207 return NULL; 207 208 208 if (length || *identifier) {209 if (length || (*identifier)) { 209 210 int index; 210 211 211 for (index = 0; index < map->next; index++) {212 for (index = 0; index < map->next; ++index) { 212 213 if (map->items[index]->c == *identifier) { 213 identifier++;214 ++identifier; 214 215 if (length == 1) 215 216 return map->items[index]; -
uspace/lib/c/generic/devman.c
rc01255c r98d06b8 116 116 { 117 117 ipc_call_t answer; 118 a id_t req = async_send_1(phone, DEVMAN_ADD_MATCH_ID, match_id->score, &answer);118 async_send_1(phone, DEVMAN_ADD_MATCH_ID, match_id->score, &answer); 119 119 int retval = async_data_write_start(phone, match_id->id, str_size(match_id->id)); 120 async_wait_for(req, NULL); 121 return retval; 120 return retval; 122 121 } 123 122 -
uspace/lib/c/include/adt/generic_field.h
rc01255c r98d06b8 91 91 } \ 92 92 field->items[field->next] = value; \ 93 field->next++; \93 ++field->next; \ 94 94 field->items[field->next] = NULL; \ 95 95 return field->next - 1; \ … … 108 108 int index; \ 109 109 field->magic = 0; \ 110 for (index = 0; index < field->next; index++) { \110 for (index = 0; index < field->next; ++ index) { \ 111 111 if (field->items[index]) \ 112 112 free(field->items[index]); \ -
uspace/lib/c/include/errno.h
rc01255c r98d06b8 83 83 #define ENOTCONN (-10057) 84 84 85 /** The requested operation was not performed. Try again later. */ 86 #define EAGAIN (-11002) 85 /** The requested operation was not performed. 86 * Try again later. 87 */ 88 #define TRY_AGAIN (-11002) 87 89 88 90 /** No data. -
uspace/lib/c/include/ipc/dev_iface.h
rc01255c r98d06b8 54 54 DEV_IFACE_ID(DEV_FIRST_CUSTOM_METHOD_IDX) 55 55 56 /*57 * The first argument is actually method (as the "real" method is used58 * for indexing into interfaces.59 */60 61 #define DEV_IPC_GET_ARG1(call) IPC_GET_ARG2((call))62 #define DEV_IPC_GET_ARG2(call) IPC_GET_ARG3((call))63 #define DEV_IPC_GET_ARG3(call) IPC_GET_ARG4((call))64 #define DEV_IPC_GET_ARG4(call) IPC_GET_ARG5((call))65 66 56 67 57 #endif -
uspace/lib/c/include/ipc/vfs.h
rc01255c r98d06b8 36 36 #define LIBC_IPC_VFS_H_ 37 37 38 #include <sys/types.h> 38 39 #include <ipc/ipc.h> 39 #include <sys/types.h>40 #include <bool.h>41 40 42 41 #define FS_NAME_MAXLEN 20 … … 56 55 /** Unique identifier of the fs. */ 57 56 char name[FS_NAME_MAXLEN + 1]; 58 bool concurrent_read_write;59 bool write_retains_size;60 57 } vfs_info_t; 61 58 -
uspace/lib/drv/generic/driver.c
rc01255c r98d06b8 381 381 } 382 382 383 /** Wrapper for child_device_register for devices with single match id.384 *385 * @param parent Parent device.386 * @param child_name Child device name.387 * @param child_match_id Child device match id.388 * @param child_match_score Child device match score.389 * @return Error code.390 */391 int child_device_register_wrapper(device_t *parent, const char *child_name,392 const char *child_match_id, int child_match_score)393 {394 device_t *child = NULL;395 match_id_t *match_id = NULL;396 int rc;397 398 child = create_device();399 if (child == NULL) {400 rc = ENOMEM;401 goto failure;402 }403 404 child->name = child_name;405 406 match_id = create_match_id();407 if (match_id == NULL) {408 rc = ENOMEM;409 goto failure;410 }411 412 match_id->id = child_match_id;413 match_id->score = child_match_score;414 add_match_id(&child->match_ids, match_id);415 416 rc = child_device_register(child, parent);417 if (EOK != rc)418 goto failure;419 420 return EOK;421 422 failure:423 if (match_id != NULL) {424 match_id->id = NULL;425 delete_match_id(match_id);426 }427 428 if (child != NULL) {429 child->name = NULL;430 delete_device(child);431 }432 433 return rc;434 }435 436 383 int driver_main(driver_t *drv) 437 384 { -
uspace/lib/drv/generic/remote_usbhc.c
rc01255c r98d06b8 108 108 } 109 109 110 devman_handle_t handle = DEV_IPC_GET_ARG1(*call);110 devman_handle_t handle = IPC_GET_ARG1(*call); 111 111 112 112 usb_address_t address; … … 122 122 ipc_callid_t callid, ipc_call_t *call) 123 123 { 124 ipcarg_t buffer_hash = DEV_IPC_GET_ARG1(*call);124 ipcarg_t buffer_hash = IPC_GET_ARG1(*call); 125 125 async_transaction_t * trans = (async_transaction_t *)buffer_hash; 126 126 if (trans == NULL) { … … 144 144 accepted_size = trans->size; 145 145 } 146 async_data_read_finalize(c id, trans->buffer, accepted_size);146 async_data_read_finalize(callid, trans->buffer, accepted_size); 147 147 148 148 ipc_answer_1(callid, EOK, accepted_size); … … 211 211 } 212 212 213 usb_address_t address = (usb_address_t) DEV_IPC_GET_ARG1(*call);214 devman_handle_t handle = (devman_handle_t) DEV_IPC_GET_ARG2(*call);213 usb_address_t address = (usb_address_t) IPC_GET_ARG1(*call); 214 devman_handle_t handle = (devman_handle_t) IPC_GET_ARG2(*call); 215 215 216 216 int rc = usb_iface->bind_address(device, address, handle); … … 229 229 } 230 230 231 usb_address_t address = (usb_address_t) DEV_IPC_GET_ARG1(*call);231 usb_address_t address = (usb_address_t) IPC_GET_ARG1(*call); 232 232 233 233 int rc = usb_iface->release_address(device, address); … … 275 275 } 276 276 277 size_t expected_len = DEV_IPC_GET_ARG3(*call);277 size_t expected_len = IPC_GET_ARG3(*call); 278 278 usb_target_t target = { 279 .address = DEV_IPC_GET_ARG1(*call),280 .endpoint = DEV_IPC_GET_ARG2(*call)279 .address = IPC_GET_ARG1(*call), 280 .endpoint = IPC_GET_ARG2(*call) 281 281 }; 282 282 … … 327 327 } 328 328 329 size_t len = DEV_IPC_GET_ARG3(*call);329 size_t len = IPC_GET_ARG3(*call); 330 330 usb_target_t target = { 331 .address = DEV_IPC_GET_ARG1(*call),332 .endpoint = DEV_IPC_GET_ARG2(*call)331 .address = IPC_GET_ARG1(*call), 332 .endpoint = IPC_GET_ARG2(*call) 333 333 }; 334 334 … … 384 384 385 385 usb_target_t target = { 386 .address = DEV_IPC_GET_ARG1(*call),387 .endpoint = DEV_IPC_GET_ARG2(*call)386 .address = IPC_GET_ARG1(*call), 387 .endpoint = IPC_GET_ARG2(*call) 388 388 }; 389 389 -
uspace/lib/drv/include/driver.h
rc01255c r98d06b8 199 199 200 200 int child_device_register(device_t *, device_t *); 201 int child_device_register_wrapper(device_t *, const char *, const char *, int);202 201 203 202 -
uspace/lib/usb/Makefile
rc01255c r98d06b8 33 33 34 34 SOURCES = \ 35 src/addrkeep.c \36 src/debug.c \37 src/drvpsync.c \38 35 src/hcdhubd.c \ 39 36 src/hcdrv.c \ … … 41 38 src/remotedrv.c \ 42 39 src/usb.c \ 43 src/usbdrvreq.c \44 40 src/usbdrv.c 45 41 -
uspace/lib/usb/include/usb/devreq.h
rc01255c r98d06b8 38 38 #include <ipc/ipc.h> 39 39 #include <async.h> 40 #include <usb/usb.h>41 #include <usb/descriptor.h>42 40 43 41 /** Standard device request. */ … … 85 83 } __attribute__ ((packed)) usb_device_request_setup_packet_t; 86 84 87 int usb_drv_req_set_address(int, usb_address_t, usb_address_t);88 int usb_drv_req_get_device_descriptor(int, usb_address_t,89 usb_standard_device_descriptor_t *);90 int usb_drv_req_get_bare_configuration_descriptor(int, usb_address_t, int,91 usb_standard_configuration_descriptor_t *);92 int usb_drv_req_get_full_configuration_descriptor(int, usb_address_t, int,93 void *, size_t, size_t *);94 95 96 85 #endif 97 86 /** -
uspace/lib/usb/include/usb/usb.h
rc01255c r98d06b8 69 69 typedef int usb_address_t; 70 70 71 /** Default USB address. */72 #define USB_ADDRESS_DEFAULT 073 /** Maximum address number in USB 1.1. */74 #define USB11_ADDRESS_MAX 12875 76 71 /** USB endpoint number type. 77 72 * Negative values could be used to indicate error. -
uspace/lib/usb/include/usb/usbdrv.h
rc01255c r98d06b8 36 36 #define LIBUSB_USBDRV_H_ 37 37 38 #include <usb/usb.h>38 #include "usb.h" 39 39 #include <driver.h> 40 #include <usb/devreq.h>41 #include <usb/descriptor.h>42 40 43 41 int usb_drv_hc_connect(device_t *, unsigned int); … … 56 54 void *, size_t, size_t *, usb_handle_t *); 57 55 58 int usb_drv_psync_interrupt_out(int, usb_target_t, void *, size_t);59 int usb_drv_psync_interrupt_in(int, usb_target_t, void *, size_t, size_t *);60 61 62 63 56 int usb_drv_async_control_write_setup(int, usb_target_t, 64 57 void *, size_t, usb_handle_t *); … … 67 60 int usb_drv_async_control_write_status(int, usb_target_t, 68 61 usb_handle_t *); 69 70 int usb_drv_psync_control_write_setup(int, usb_target_t, void *, size_t);71 int usb_drv_psync_control_write_data(int, usb_target_t, void *, size_t);72 int usb_drv_psync_control_write_status(int, usb_target_t);73 74 int usb_drv_psync_control_write(int, usb_target_t,75 void *, size_t, void *, size_t);76 77 62 78 63 int usb_drv_async_control_read_setup(int, usb_target_t, … … 83 68 usb_handle_t *); 84 69 85 int usb_drv_psync_control_read_setup(int, usb_target_t, void *, size_t);86 int usb_drv_psync_control_read_data(int, usb_target_t, void *, size_t, size_t *);87 int usb_drv_psync_control_read_status(int, usb_target_t);88 89 int usb_drv_psync_control_read(int, usb_target_t,90 void *, size_t, void *, size_t, size_t *);91 92 93 94 70 int usb_drv_async_wait_for(usb_handle_t); 95 96 71 97 72 #endif -
uspace/lib/usb/src/usbdrv.c
rc01255c r98d06b8 71 71 devman_handle_t handle; 72 72 73 rc = devman_device_get_handle("/v irt/usbhc", &handle, 0);73 rc = devman_device_get_handle("/vhc", &handle, 0); 74 74 if (rc != EOK) { 75 75 return rc; -
uspace/lib/usbvirt/main.c
rc01255c r98d06b8 183 183 } 184 184 185 /** Create necessary phones for com munication with virtual HCD.185 /** Create necessary phones for comunication with virtual HCD. 186 186 * This function wraps following calls: 187 * -# open <code>/dev/devices/\\v irt\\usbhc for reading187 * -# open <code>/dev/devices/\\vhc for reading 188 188 * -# access phone of file opened in previous step 189 189 * -# create callback through just opened phone … … 193 193 * @warning This function is wrapper for several actions and therefore 194 194 * it is not possible - in case of error - to determine at which point 195 * error occurred. 196 * 195 * error occured. 196 * 197 * @param hcd_path HCD identification under devfs 198 * (without <code>/dev/usb/</code>). 197 199 * @param dev Device to connect. 198 200 * @return EOK on success or error code from errno.h. … … 205 207 } 206 208 207 const char *vhc_path = "/v irt/usbhc";209 const char *vhc_path = "/vhc"; 208 210 int rc; 209 211 devman_handle_t handle; -
uspace/srv/devman/devman.c
rc01255c r98d06b8 516 516 /** Notify driver about the devices to which it was assigned. 517 517 * 518 * The driver's mutex must be locked. 519 * 518 520 * @param driver The driver to which the devices are passed. 519 521 */ … … 524 526 int phone; 525 527 526 printf(NAME ": pass_devices_to_driver(`%s')\n", driver->name); 527 528 fibril_mutex_lock(&driver->driver_mutex); 529 530 phone = async_connect_me_to(driver->phone, DRIVER_DEVMAN, 0, 0); 531 532 if (phone < 0) { 533 fibril_mutex_unlock(&driver->driver_mutex); 534 return; 535 } 536 537 /* 538 * Go through devices list as long as there is some device 539 * that has not been passed to the driver. 540 */ 541 link = driver->devices.next; 542 while (link != &driver->devices) { 543 dev = list_get_instance(link, node_t, driver_devices); 544 if (dev->passed_to_driver) { 528 printf(NAME ": pass_devices_to_driver\n"); 529 530 phone = ipc_connect_me_to(driver->phone, DRIVER_DEVMAN, 0, 0); 531 if (phone > 0) { 532 533 link = driver->devices.next; 534 while (link != &driver->devices) { 535 dev = list_get_instance(link, node_t, driver_devices); 536 add_device(phone, driver, dev, tree); 545 537 link = link->next; 546 continue;547 538 } 548 549 /* 550 * We remove the device from the list to allow safe adding 551 * of new devices (no one will touch our item this way). 552 */ 553 list_remove(link); 554 555 /* 556 * Unlock to avoid deadlock when adding device 557 * handled by itself. 558 */ 559 fibril_mutex_unlock(&driver->driver_mutex); 560 561 add_device(phone, driver, dev, tree); 562 563 /* 564 * Lock again as we will work with driver's 565 * structure. 566 */ 567 fibril_mutex_lock(&driver->driver_mutex); 568 569 /* 570 * Insert the device back. 571 * The order is not relevant here so no harm is done 572 * (actually, the order would be preserved in most cases). 573 */ 574 list_append(link, &driver->devices); 575 576 /* 577 * Restart the cycle to go through all devices again. 578 */ 579 link = driver->devices.next; 580 } 581 582 ipc_hangup(phone); 583 584 /* 585 * Once we passed all devices to the driver, we need to mark the 586 * driver as running. 587 * It is vital to do it here and inside critical section. 588 * 589 * If we would change the state earlier, other devices added to 590 * the driver would be added to the device list and started 591 * immediately and possibly started here as well. 592 */ 593 printf(NAME ": driver %s goes into running state.\n", driver->name); 594 driver->state = DRIVER_RUNNING; 595 596 fibril_mutex_unlock(&driver->driver_mutex); 539 540 ipc_hangup(phone); 541 } 597 542 } 598 543 … … 608 553 void initialize_running_driver(driver_t *driver, dev_tree_t *tree) 609 554 { 610 printf(NAME ": initialize_running_driver (`%s')\n", driver->name); 555 printf(NAME ": initialize_running_driver\n"); 556 fibril_mutex_lock(&driver->driver_mutex); 611 557 612 558 /* … … 615 561 */ 616 562 pass_devices_to_driver(driver, tree); 563 564 /* Change driver's state to running. */ 565 driver->state = DRIVER_RUNNING; 566 567 fibril_mutex_unlock(&driver->driver_mutex); 617 568 } 618 569 … … 686 637 } 687 638 688 static FIBRIL_MUTEX_INITIALIZE(add_device_guard);689 639 690 640 /** Pass a device to running driver. … … 695 645 void add_device(int phone, driver_t *drv, node_t *node, dev_tree_t *tree) 696 646 { 697 fibril_mutex_lock(&add_device_guard); 698 699 /* 700 * We do not expect to have driver's mutex locked as we do not 701 * access any structures that would affect driver_t. 702 */ 703 printf(NAME ": add_device (driver `%s', device `%s')\n", drv->name, 704 node->name); 647 printf(NAME ": add_device\n"); 705 648 706 649 ipcarg_t rc; … … 714 657 parent_handle = 0; 715 658 } 716 717 659 aid_t req = async_send_2(phone, DRIVER_ADD_DEVICE, node->handle, 718 660 parent_handle, &answer); … … 724 666 /* TODO handle error */ 725 667 } 726 668 727 669 /* Wait for answer from the driver. */ 728 670 async_wait_for(req, &rc); 729 730 fibril_mutex_unlock(&add_device_guard);731 732 671 switch(rc) { 733 672 case EOK: … … 742 681 } 743 682 744 node->passed_to_driver = true;745 746 683 return; 747 684 } … … 769 706 attach_driver(node, drv); 770 707 771 fibril_mutex_lock(&drv->driver_mutex);772 708 if (drv->state == DRIVER_NOT_STARTED) { 773 709 /* Start the driver. */ 774 710 start_driver(drv); 775 711 } 776 bool is_running = drv->state == DRIVER_RUNNING; 777 fibril_mutex_unlock(&drv->driver_mutex); 778 779 if (is_running) { 712 713 if (drv->state == DRIVER_RUNNING) { 780 714 /* Notify the driver about the new device. */ 781 int phone = async_connect_me_to(drv->phone, DRIVER_DEVMAN, 0, 0);715 int phone = ipc_connect_me_to(drv->phone, DRIVER_DEVMAN, 0, 0); 782 716 if (phone > 0) { 783 717 add_device(phone, drv, node, tree); … … 941 875 node->name = dev_name; 942 876 if (!set_dev_path(node, parent)) { 877 fibril_rwlock_write_unlock(&tree->rwlock); 943 878 return false; 944 879 } … … 1162 1097 while (link != &class_list->classes) { 1163 1098 cl = list_get_instance(link, dev_class_t, link); 1164 if (str_cmp(cl->name, class_name) == 0) {1099 if (str_cmp(cl->name, class_name) == 0) 1165 1100 return cl; 1166 }1167 link = link->next;1168 1101 } 1169 1102 -
uspace/srv/devman/devman.h
rc01255c r98d06b8 168 168 */ 169 169 link_t devmap_link; 170 171 /**172 * Whether this device was already passed to the driver.173 */174 bool passed_to_driver;175 170 }; 176 171 -
uspace/srv/devman/main.c
rc01255c r98d06b8 197 197 } 198 198 199 static int assign_driver_fibril(void *arg)200 {201 node_t *node = (node_t *) arg;202 assign_driver(node, &drivers_list, &device_tree);203 return EOK;204 }205 206 199 /** Handle child device registration. 207 200 * … … 244 237 245 238 devman_receive_match_ids(match_count, &node->match_ids); 246 247 /* 248 * Try to find a suitable driver and assign it to the device. We do 249 * not want to block the current fibril that is used for processing 250 * incoming calls: we will launch a separate fibril to handle the 251 * driver assigning. That is because assign_driver can actually include 252 * task spawning which could take some time. 253 */ 254 fid_t assign_fibril = fibril_create(assign_driver_fibril, node); 255 if (assign_fibril == 0) { 256 /* 257 * Fallback in case we are out of memory. 258 * Probably not needed as we will die soon anyway ;-). 259 */ 260 (void) assign_driver_fibril(node); 261 } else { 262 fibril_add_ready(assign_fibril); 263 } 264 239 265 240 /* Return device handle to parent's driver. */ 266 241 ipc_answer_1(callid, EOK, node->handle); 242 243 /* Try to find suitable driver and assign it to the device. */ 244 assign_driver(node, &drivers_list, &device_tree); 267 245 } 268 246 … … 319 297 printf(NAME ": device '%s' added to class '%s', class name '%s' was " 320 298 "asigned to it\n", dev->pathname, class_name, class_info->dev_name); 321 299 322 300 ipc_answer_0(callid, EOK); 323 301 } -
uspace/srv/devman/match.c
rc01255c r98d06b8 46 46 if (str_cmp(driver->id, device->id) == 0) { 47 47 /* 48 * The strings match , return the product of their scores.48 * The strings matches, return their score multiplied. 49 49 */ 50 50 return driver->score * device->score; … … 66 66 67 67 /* 68 * Go through all pairs, return the highest score obtaine d.68 * Go through all pairs, return the highest score obtainetd. 69 69 */ 70 70 int highest_score = 0; -
uspace/srv/fs/devfs/devfs.c
rc01255c r98d06b8 53 53 static vfs_info_t devfs_vfs_info = { 54 54 .name = NAME, 55 .concurrent_read_write = false,56 .write_retains_size = false,57 55 }; 58 56 -
uspace/srv/fs/fat/fat.c
rc01255c r98d06b8 52 52 vfs_info_t fat_vfs_info = { 53 53 .name = NAME, 54 .concurrent_read_write = false,55 .write_retains_size = false,56 54 }; 57 55 -
uspace/srv/fs/tmpfs/tmpfs.c
rc01255c r98d06b8 57 57 vfs_info_t tmpfs_vfs_info = { 58 58 .name = NAME, 59 .concurrent_read_write = false,60 .write_retains_size = false,61 59 }; 62 60 -
uspace/srv/net/il/arp/arp.c
rc01255c r98d06b8 72 72 #define NAME "arp" 73 73 74 /** Number of microseconds to wait for an ARP reply. */75 #define ARP_TRANS_WAIT 100000076 77 74 /** ARP global data. */ 78 75 arp_globals_t arp_globals; … … 80 77 DEVICE_MAP_IMPLEMENT(arp_cache, arp_device_t); 81 78 INT_MAP_IMPLEMENT(arp_protos, arp_proto_t); 82 GENERIC_CHAR_MAP_IMPLEMENT(arp_addr, arp_trans_t); 83 84 static void arp_clear_trans(arp_trans_t *trans) 85 { 86 if (trans->hw_addr) { 87 free(trans->hw_addr); 88 trans->hw_addr = NULL; 89 } 90 fibril_condvar_broadcast(&trans->cv); 91 } 92 93 static void arp_clear_addr(arp_addr_t *addresses) 94 { 95 int count; 96 arp_trans_t *trans; 97 98 for (count = arp_addr_count(addresses) - 1; count >= 0; count--) { 99 trans = arp_addr_items_get_index(&addresses->values, count); 100 if (trans) 101 arp_clear_trans(trans); 102 } 103 } 104 79 GENERIC_CHAR_MAP_IMPLEMENT(arp_addr, measured_string_t); 105 80 106 81 /** Clears the device specific data. … … 121 96 if (proto->addr_data) 122 97 free(proto->addr_data); 123 arp_clear_addr(&proto->addresses);124 98 arp_addr_destroy(&proto->addresses); 125 99 } … … 133 107 arp_device_t *device; 134 108 135 fibril_ mutex_lock(&arp_globals.lock);109 fibril_rwlock_write_lock(&arp_globals.lock); 136 110 for (count = arp_cache_count(&arp_globals.cache) - 1; count >= 0; 137 111 count--) { … … 146 120 } 147 121 arp_cache_clear(&arp_globals.cache); 148 fibril_ mutex_unlock(&arp_globals.lock);122 fibril_rwlock_write_unlock(&arp_globals.lock); 149 123 printf("Cache cleaned\n"); 150 124 return EOK; … … 156 130 arp_device_t *device; 157 131 arp_proto_t *proto; 158 arp_trans_t *trans; 159 160 fibril_mutex_lock(&arp_globals.lock); 132 133 fibril_rwlock_write_lock(&arp_globals.lock); 161 134 device = arp_cache_find(&arp_globals.cache, device_id); 162 135 if (!device) { 163 fibril_ mutex_unlock(&arp_globals.lock);136 fibril_rwlock_write_unlock(&arp_globals.lock); 164 137 return ENOENT; 165 138 } 166 139 proto = arp_protos_find(&device->protos, protocol); 167 140 if (!proto) { 168 fibril_ mutex_unlock(&arp_globals.lock);141 fibril_rwlock_write_unlock(&arp_globals.lock); 169 142 return ENOENT; 170 143 } 171 trans = arp_addr_find(&proto->addresses, address->value, address->length);172 if (trans)173 arp_clear_trans(trans);174 144 arp_addr_exclude(&proto->addresses, address->value, address->length); 175 fibril_ mutex_unlock(&arp_globals.lock);145 fibril_rwlock_write_unlock(&arp_globals.lock); 176 146 return EOK; 177 147 } … … 182 152 arp_device_t *device; 183 153 184 fibril_ mutex_lock(&arp_globals.lock);154 fibril_rwlock_write_lock(&arp_globals.lock); 185 155 device = arp_cache_find(&arp_globals.cache, device_id); 186 156 if (!device) { 187 fibril_ mutex_unlock(&arp_globals.lock);157 fibril_rwlock_write_unlock(&arp_globals.lock); 188 158 return ENOENT; 189 159 } 190 160 arp_clear_device(device); 191 161 printf("Device %d cleared\n", device_id); 192 fibril_ mutex_unlock(&arp_globals.lock);162 fibril_rwlock_write_unlock(&arp_globals.lock); 193 163 return EOK; 194 164 } … … 251 221 int rc; 252 222 253 fibril_ mutex_lock(&arp_globals.lock);223 fibril_rwlock_write_lock(&arp_globals.lock); 254 224 255 225 /* An existing device? */ … … 259 229 if (device->service != service) { 260 230 printf("Device %d already exists\n", device->device_id); 261 fibril_ mutex_unlock(&arp_globals.lock);231 fibril_rwlock_write_unlock(&arp_globals.lock); 262 232 return EEXIST; 263 233 } … … 271 241 rc = arp_proto_create(&proto, protocol, address); 272 242 if (rc != EOK) { 273 fibril_ mutex_unlock(&arp_globals.lock);243 fibril_rwlock_write_unlock(&arp_globals.lock); 274 244 return rc; 275 245 } … … 277 247 proto); 278 248 if (index < 0) { 279 fibril_ mutex_unlock(&arp_globals.lock);249 fibril_rwlock_write_unlock(&arp_globals.lock); 280 250 free(proto); 281 251 return index; … … 292 262 device = (arp_device_t *) malloc(sizeof(arp_device_t)); 293 263 if (!device) { 294 fibril_ mutex_unlock(&arp_globals.lock);264 fibril_rwlock_write_unlock(&arp_globals.lock); 295 265 return ENOMEM; 296 266 } … … 299 269 rc = arp_protos_initialize(&device->protos); 300 270 if (rc != EOK) { 301 fibril_ mutex_unlock(&arp_globals.lock);271 fibril_rwlock_write_unlock(&arp_globals.lock); 302 272 free(device); 303 273 return rc; … … 305 275 rc = arp_proto_create(&proto, protocol, address); 306 276 if (rc != EOK) { 307 fibril_ mutex_unlock(&arp_globals.lock);277 fibril_rwlock_write_unlock(&arp_globals.lock); 308 278 free(device); 309 279 return rc; … … 311 281 index = arp_protos_add(&device->protos, proto->service, proto); 312 282 if (index < 0) { 313 fibril_ mutex_unlock(&arp_globals.lock);283 fibril_rwlock_write_unlock(&arp_globals.lock); 314 284 arp_protos_destroy(&device->protos); 315 285 free(device); … … 323 293 arp_globals.client_connection); 324 294 if (device->phone < 0) { 325 fibril_ mutex_unlock(&arp_globals.lock);295 fibril_rwlock_write_unlock(&arp_globals.lock); 326 296 arp_protos_destroy(&device->protos); 327 297 free(device); … … 333 303 &device->packet_dimension); 334 304 if (rc != EOK) { 335 fibril_ mutex_unlock(&arp_globals.lock);305 fibril_rwlock_write_unlock(&arp_globals.lock); 336 306 arp_protos_destroy(&device->protos); 337 307 free(device); … … 343 313 &device->addr_data); 344 314 if (rc != EOK) { 345 fibril_ mutex_unlock(&arp_globals.lock);315 fibril_rwlock_write_unlock(&arp_globals.lock); 346 316 arp_protos_destroy(&device->protos); 347 317 free(device); … … 353 323 &device->broadcast_addr, &device->broadcast_data); 354 324 if (rc != EOK) { 355 fibril_ mutex_unlock(&arp_globals.lock);325 fibril_rwlock_write_unlock(&arp_globals.lock); 356 326 free(device->addr); 357 327 free(device->addr_data); … … 364 334 device); 365 335 if (rc != EOK) { 366 fibril_ mutex_unlock(&arp_globals.lock);336 fibril_rwlock_write_unlock(&arp_globals.lock); 367 337 free(device->addr); 368 338 free(device->addr_data); … … 377 347 device->service, protocol); 378 348 } 379 fibril_ mutex_unlock(&arp_globals.lock);349 fibril_rwlock_write_unlock(&arp_globals.lock); 380 350 381 351 return EOK; … … 393 363 int rc; 394 364 395 fibril_ mutex_initialize(&arp_globals.lock);396 fibril_ mutex_lock(&arp_globals.lock);365 fibril_rwlock_initialize(&arp_globals.lock); 366 fibril_rwlock_write_lock(&arp_globals.lock); 397 367 arp_globals.client_connection = client_connection; 398 368 rc = arp_cache_initialize(&arp_globals.cache); 399 fibril_ mutex_unlock(&arp_globals.lock);369 fibril_rwlock_write_unlock(&arp_globals.lock); 400 370 401 371 return rc; … … 413 383 arp_device_t *device; 414 384 415 fibril_ mutex_lock(&arp_globals.lock);385 fibril_rwlock_write_lock(&arp_globals.lock); 416 386 device = arp_cache_find(&arp_globals.cache, device_id); 417 387 if (!device) { 418 fibril_ mutex_unlock(&arp_globals.lock);388 fibril_rwlock_write_unlock(&arp_globals.lock); 419 389 return ENOENT; 420 390 } 421 391 device->packet_dimension.content = mtu; 422 fibril_ mutex_unlock(&arp_globals.lock);392 fibril_rwlock_write_unlock(&arp_globals.lock); 423 393 printf("arp - device %d changed mtu to %zu\n\n", device_id, mtu); 424 394 return EOK; … … 451 421 arp_device_t *device; 452 422 arp_proto_t *proto; 453 arp_trans_t *trans;423 measured_string_t *hw_source; 454 424 uint8_t *src_hw; 455 425 uint8_t *src_proto; … … 482 452 des_hw = src_proto + header->protocol_length; 483 453 des_proto = des_hw + header->hardware_length; 484 trans= arp_addr_find(&proto->addresses, (char *) src_proto,454 hw_source = arp_addr_find(&proto->addresses, (char *) src_proto, 485 455 CONVERT_SIZE(uint8_t, char, header->protocol_length)); 486 456 /* Exists? */ 487 if ( trans && trans->hw_addr) {488 if ( trans->hw_addr->length != CONVERT_SIZE(uint8_t, char,457 if (hw_source) { 458 if (hw_source->length != CONVERT_SIZE(uint8_t, char, 489 459 header->hardware_length)) { 490 460 return EINVAL; 491 461 } 492 memcpy( trans->hw_addr->value, src_hw, trans->hw_addr->length);462 memcpy(hw_source->value, src_hw, hw_source->length); 493 463 } 494 464 /* Is my protocol address? */ … … 500 470 proto->addr->length)) { 501 471 /* Not already updated? */ 502 if (!trans) { 503 trans = (arp_trans_t *) malloc(sizeof(arp_trans_t)); 504 if (!trans) 472 if (!hw_source) { 473 hw_source = measured_string_create_bulk((char *) src_hw, 474 CONVERT_SIZE(uint8_t, char, 475 header->hardware_length)); 476 if (!hw_source) 505 477 return ENOMEM; 506 trans->hw_addr = NULL; 507 fibril_condvar_initialize(&trans->cv); 478 508 479 rc = arp_addr_add(&proto->addresses, (char *) src_proto, 509 CONVERT_SIZE(uint8_t, char, header->protocol_length), 510 trans); 511 if (rc != EOK) { 512 /* The generic char map has already freed trans! */ 480 CONVERT_SIZE(uint8_t, char, 481 header->protocol_length), hw_source); 482 if (rc != EOK) 513 483 return rc; 514 }515 }516 if (!trans->hw_addr) {517 trans->hw_addr = measured_string_create_bulk(518 (char *) src_hw, CONVERT_SIZE(uint8_t, char,519 header->hardware_length));520 if (!trans->hw_addr)521 return ENOMEM;522 523 /* Notify the fibrils that wait for the translation. */524 fibril_condvar_broadcast(&trans->cv);525 484 } 526 485 if (ntohs(header->operation) == ARPOP_REQUEST) { … … 531 490 memcpy(src_hw, device->addr->value, 532 491 device->packet_dimension.addr_len); 533 memcpy(des_hw, trans->hw_addr->value,492 memcpy(des_hw, hw_source->value, 534 493 header->hardware_length); 535 494 … … 557 516 * @param[in] protocol The protocol service. 558 517 * @param[in] target The target protocol address. 559 * @param[out] translation Where the hardware address of the target is stored. 560 * @return EOK on success. 561 * @return EAGAIN if the caller should try again. 562 * @return Other error codes in case of error. 563 */ 564 static int 518 * @return The hardware address of the target. 519 * @return NULL if the target parameter is NULL. 520 * @return NULL if the device is not found. 521 * @return NULL if the device packet is too small to send a 522 * request. 523 * @return NULL if the hardware address is not found in the cache. 524 */ 525 static measured_string_t * 565 526 arp_translate_message(device_id_t device_id, services_t protocol, 566 measured_string_t *target , measured_string_t **translation)527 measured_string_t *target) 567 528 { 568 529 arp_device_t *device; 569 530 arp_proto_t *proto; 570 arp_trans_t *trans;531 measured_string_t *addr; 571 532 size_t length; 572 533 packet_t *packet; 573 534 arp_header_t *header; 574 bool retry = false; 575 int rc; 576 577 restart: 578 if (!target || !translation) 579 return EBADMEM; 535 536 if (!target) 537 return NULL; 580 538 581 539 device = arp_cache_find(&arp_globals.cache, device_id); 582 540 if (!device) 583 return ENOENT;541 return NULL; 584 542 585 543 proto = arp_protos_find(&device->protos, protocol); 586 544 if (!proto || (proto->addr->length != target->length)) 587 return ENOENT; 588 589 trans = arp_addr_find(&proto->addresses, target->value, target->length); 590 if (trans) { 591 if (trans->hw_addr) { 592 *translation = trans->hw_addr; 593 return EOK; 594 } 595 if (retry) 596 return EAGAIN; 597 rc = fibril_condvar_wait_timeout(&trans->cv, &arp_globals.lock, 598 ARP_TRANS_WAIT); 599 if (rc == ETIMEOUT) 600 return ENOENT; 601 retry = true; 602 goto restart; 603 } 604 if (retry) 605 return EAGAIN; 545 return NULL; 546 547 addr = arp_addr_find(&proto->addresses, target->value, target->length); 548 if (addr) 549 return addr; 606 550 607 551 /* ARP packet content size = header + (address + translation) * 2 */ … … 609 553 CONVERT_SIZE(char, uint8_t, device->addr->length)); 610 554 if (length > device->packet_dimension.content) 611 return ELIMIT;555 return NULL; 612 556 613 557 packet = packet_get_4_remote(arp_globals.net_phone, … … 615 559 length, device->packet_dimension.suffix); 616 560 if (!packet) 617 return ENOMEM;561 return NULL; 618 562 619 563 header = (arp_header_t *) packet_suffix(packet, length); 620 564 if (!header) { 621 565 pq_release_remote(arp_globals.net_phone, packet_get_id(packet)); 622 return ENOMEM;566 return NULL; 623 567 } 624 568 … … 639 583 memcpy(((uint8_t *) header) + length, target->value, target->length); 640 584 641 rc =packet_set_addr(packet, (uint8_t *) device->addr->value,585 if (packet_set_addr(packet, (uint8_t *) device->addr->value, 642 586 (uint8_t *) device->broadcast_addr->value, 643 CONVERT_SIZE(char, uint8_t, device->addr->length)); 644 if (rc != EOK) { 587 CONVERT_SIZE(char, uint8_t, device->addr->length)) != EOK) { 645 588 pq_release_remote(arp_globals.net_phone, packet_get_id(packet)); 646 return rc;589 return NULL; 647 590 } 648 591 649 592 nil_send_msg(device->phone, device_id, packet, SERVICE_ARP); 650 651 trans = (arp_trans_t *) malloc(sizeof(arp_trans_t)); 652 if (!trans) 653 return ENOMEM; 654 trans->hw_addr = NULL; 655 fibril_condvar_initialize(&trans->cv); 656 rc = arp_addr_add(&proto->addresses, target->value, target->length, 657 trans); 658 if (rc != EOK) { 659 /* The generic char map has already freed trans! */ 660 return rc; 661 } 662 663 rc = fibril_condvar_wait_timeout(&trans->cv, &arp_globals.lock, 664 ARP_TRANS_WAIT); 665 if (rc == ETIMEOUT) 666 return ENOENT; 667 retry = true; 668 goto restart; 593 return NULL; 669 594 } 670 595 … … 717 642 return rc; 718 643 719 fibril_ mutex_lock(&arp_globals.lock);720 rc= arp_translate_message(IPC_GET_DEVICE(call),721 IPC_GET_SERVICE(call), address , &translation);644 fibril_rwlock_read_lock(&arp_globals.lock); 645 translation = arp_translate_message(IPC_GET_DEVICE(call), 646 IPC_GET_SERVICE(call), address); 722 647 free(address); 723 648 free(data); 724 if (rc != EOK) {725 fibril_mutex_unlock(&arp_globals.lock);726 return rc;727 }728 649 if (!translation) { 729 fibril_ mutex_unlock(&arp_globals.lock);650 fibril_rwlock_read_unlock(&arp_globals.lock); 730 651 return ENOENT; 731 652 } 732 653 rc = measured_strings_reply(translation, 1); 733 fibril_ mutex_unlock(&arp_globals.lock);654 fibril_rwlock_read_unlock(&arp_globals.lock); 734 655 return rc; 735 656 … … 761 682 return rc; 762 683 763 fibril_ mutex_lock(&arp_globals.lock);684 fibril_rwlock_read_lock(&arp_globals.lock); 764 685 do { 765 686 next = pq_detach(packet); … … 771 692 packet = next; 772 693 } while (packet); 773 fibril_ mutex_unlock(&arp_globals.lock);694 fibril_rwlock_read_unlock(&arp_globals.lock); 774 695 775 696 return EOK; -
uspace/srv/net/il/arp/arp.h
rc01255c r98d06b8 65 65 typedef struct arp_proto arp_proto_t; 66 66 67 /** Type definition of the ARP address translation record.68 * @see arp_trans69 */70 typedef struct arp_trans arp_trans_t;71 72 67 /** ARP address map. 73 68 * … … 75 70 * @see generic_char_map.h 76 71 */ 77 GENERIC_CHAR_MAP_DECLARE(arp_addr, arp_trans_t);72 GENERIC_CHAR_MAP_DECLARE(arp_addr, measured_string_t); 78 73 79 74 /** ARP address cache. … … 94 89 struct arp_device { 95 90 /** Actual device hardware address. */ 96 measured_string_t * addr;91 measured_string_t * addr; 97 92 /** Actual device hardware address data. */ 98 93 char *addr_data; 99 94 /** Broadcast device hardware address. */ 100 measured_string_t * broadcast_addr;95 measured_string_t * broadcast_addr; 101 96 /** Broadcast device hardware address data. */ 102 97 char *broadcast_data; … … 134 129 int net_phone; 135 130 /** Safety lock. */ 136 fibril_ mutex_t lock;131 fibril_rwlock_t lock; 137 132 }; 138 133 … … 149 144 }; 150 145 151 /** ARP address translation record. */152 struct arp_trans {153 /**154 * Hardware address for the translation. NULL denotes an incomplete155 * record with possible waiters.156 */157 measured_string_t *hw_addr;158 /** Condition variable used for waiting for completion of the record. */159 fibril_condvar_t cv;160 };161 162 146 #endif 163 147 164 148 /** @} 165 149 */ 166 -
uspace/srv/vfs/vfs.h
rc01255c r98d06b8 172 172 173 173 extern fs_handle_t fs_name_to_handle(char *, bool); 174 extern vfs_info_t *fs_handle_to_info(fs_handle_t);175 174 176 175 extern int vfs_lookup_internal(char *, int, vfs_lookup_res_t *, -
uspace/srv/vfs/vfs_ops.c
rc01255c r98d06b8 781 781 static void vfs_rdwr(ipc_callid_t rid, ipc_call_t *request, bool read) 782 782 { 783 vfs_info_t *vi;784 783 785 784 /* … … 808 807 fibril_mutex_lock(&file->lock); 809 808 810 vi = fs_handle_to_info(file->node->fs_handle);811 assert(vi);812 813 809 /* 814 810 * Lock the file's node so that no other client can read/write to it at 815 * the same time unless the FS supports concurrent reads/writes and its 816 * write implementation does not modify the file size. 817 */ 818 if (read || (vi->concurrent_read_write && vi->write_retains_size)) 811 * the same time. 812 */ 813 if (read) 819 814 fibril_rwlock_read_lock(&file->node->contents_rwlock); 820 815 else … … 862 857 863 858 /* Unlock the VFS node. */ 864 if (read || (vi->concurrent_read_write && vi->write_retains_size))859 if (read) 865 860 fibril_rwlock_read_unlock(&file->node->contents_rwlock); 866 861 else { -
uspace/srv/vfs/vfs_register.c
rc01255c r98d06b8 333 333 } 334 334 335 /** Find the VFS info structure.336 *337 * @param handle FS handle for which the VFS info structure is sought.338 * @return VFS info structure on success or NULL otherwise.339 */340 vfs_info_t *fs_handle_to_info(fs_handle_t handle)341 {342 vfs_info_t *info = NULL;343 link_t *cur;344 345 fibril_mutex_lock(&fs_head_lock);346 for (cur = fs_head.next; cur != &fs_head; cur = cur->next) {347 fs_info_t *fs = list_get_instance(cur, fs_info_t, fs_link);348 if (fs->fs_handle == handle) {349 info = &fs->vfs_info;350 break;351 }352 }353 fibril_mutex_unlock(&fs_head_lock);354 355 return info;356 }357 358 335 /** 359 336 * @}
Note:
See TracChangeset
for help on using the changeset viewer.