- Timestamp:
- 2010-12-12T10:50:19Z (15 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 8365533
- Parents:
- 101ef25c (diff), ebb98c5 (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
- Files:
-
- 31 added
- 1 deleted
- 60 edited
- 3 moved
Legend:
- Unmodified
- Added
- Removed
-
uspace/Makefile
r101ef25c r243cb86 49 49 app/trace \ 50 50 app/top \ 51 app/usbinfo \ 51 52 app/virtusbkbd \ 52 53 app/netecho \ … … 87 88 srv/net/net \ 88 89 drv/root \ 90 drv/rootvirt \ 91 drv/test1 \ 92 drv/test2 \ 89 93 drv/vhc 90 94 … … 110 114 111 115 ifeq ($(UARCH),amd64) 116 DIRS += drv/rootpc 117 DIRS += drv/pciintel 118 DIRS += drv/isa 119 DIRS += drv/ns8250 112 120 endif 113 121 114 122 ifeq ($(UARCH),ia32) 115 DIRS += drv/root ia32123 DIRS += drv/rootpc 116 124 DIRS += drv/pciintel 117 125 DIRS += drv/isa 118 126 DIRS += drv/ns8250 119 127 DIRS += drv/uhci 128 DIRS += drv/usbhub 120 129 DIRS += drv/usbkbd 121 130 endif -
uspace/app/netecho/print_error.c
r101ef25c r243cb86 164 164 case EDESTADDRREQ: 165 165 fprintf(output, "Destination address required (%d) error", error_code); 166 case TRY_AGAIN:166 case EAGAIN: 167 167 fprintf(output, "Try again (%d) error", error_code); 168 168 default: -
uspace/app/tester/Makefile
r101ef25c r243cb86 31 31 BINARY = tester 32 32 33 LIBS += $(LIBUSB_PREFIX)/libusb.a 34 EXTRA_CFLAGS += -I$(LIBUSB_PREFIX)/include 35 33 36 SOURCES = \ 34 37 tester.c \ 38 adt/usbaddrkeep.c \ 35 39 thread/thread1.c \ 36 40 print/print1.c \ -
uspace/app/tester/tester.c
r101ef25c r243cb86 65 65 #include "mm/malloc1.def" 66 66 #include "hw/serial/serial1.def" 67 #include "adt/usbaddrkeep.def" 67 68 {NULL, NULL, NULL, false} 68 69 }; -
uspace/app/tester/tester.h
r101ef25c r243cb86 82 82 extern const char *test_malloc1(void); 83 83 extern const char *test_serial1(void); 84 extern const char *test_usbaddrkeep(void); 84 85 85 86 extern test_t tests[]; -
uspace/app/virtusbkbd/virtusbkbd.c
r101ef25c r243cb86 202 202 int main(int argc, char * argv[]) 203 203 { 204 printf("Dump of report descriptor (% u bytes):\n", report_descriptor_size);204 printf("Dump of report descriptor (%zu bytes):\n", report_descriptor_size); 205 205 size_t i; 206 206 for (i = 0; i < report_descriptor_size; i++) { -
uspace/drv/isa/isa.c
r101ef25c r243cb86 282 282 283 283 printf(NAME ": added io range (addr=0x%x, size=0x%x) to " 284 "device %s\n", addr, len, dev->name); 284 "device %s\n", (unsigned int) addr, (unsigned int) len, 285 dev->name); 285 286 } 286 287 } … … 489 490 static int isa_add_device(device_t *dev) 490 491 { 491 printf(NAME ": isa_add_device, device handle = %d\n", dev->handle); 492 printf(NAME ": isa_add_device, device handle = %d\n", 493 (int) dev->handle); 492 494 493 495 /* Add child devices. */ -
uspace/drv/ns8250/ns8250.c
r101ef25c r243cb86 274 274 275 275 /* Gain control over port's registers. */ 276 if (pio_enable((void *) data->io_addr, REG_COUNT,276 if (pio_enable((void *)(uintptr_t) 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, dev->handle);729 dev->name, (int) dev->handle); 730 730 731 731 int res = ns8250_dev_initialize(dev); -
uspace/drv/pciintel/pci.c
r101ef25c r243cb86 324 324 printf(NAME ": device %s : ", dev->name); 325 325 printf("address = %" PRIx64, range_addr); 326 printf(", size = %x\n", range_size);326 printf(", size = %x\n", (unsigned int) 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 *) bus_data->conf_io_addr, 8,491 if (pio_enable((void *)(uintptr_t)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
r101ef25c r243cb86 1 1 /* 2 2 * Copyright (c) 2010 Lenka Trochtova 3 * Copyright (c) 2010 Vojtech Horky 3 4 * All rights reserved. 4 5 * … … 53 54 #define NAME "root" 54 55 56 #define PLATFORM_DEVICE_NAME "hw" 57 #define PLATFORM_DEVICE_MATCH_ID STRING(UARCH) 58 #define PLATFORM_DEVICE_MATCH_SCORE 100 59 60 #define VIRTUAL_DEVICE_NAME "virt" 61 #define VIRTUAL_DEVICE_MATCH_ID "rootvirt" 62 #define VIRTUAL_DEVICE_MATCH_SCORE 100 63 55 64 static int root_add_device(device_t *dev); 56 65 … … 66 75 }; 67 76 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 NULL); 91 92 return res; 93 } 94 68 95 /** Create the device which represents the root of HW device tree. 69 96 * … … 74 101 { 75 102 printf(NAME ": adding new child for platform device.\n"); 103 printf(NAME ": device node is `%s' (%d %s)\n", PLATFORM_DEVICE_NAME, 104 PLATFORM_DEVICE_MATCH_SCORE, PLATFORM_DEVICE_MATCH_ID); 76 105 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 106 int res = child_device_register_wrapper(parent, PLATFORM_DEVICE_NAME, 107 PLATFORM_DEVICE_MATCH_ID, PLATFORM_DEVICE_MATCH_SCORE, 108 NULL); 109 108 110 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 one124 * 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;174 111 } 175 112 … … 184 121 dev->handle); 185 122 123 /* 124 * Register virtual devices root. 125 * We ignore error occurrence because virtual devices shall not be 126 * vital for the system. 127 */ 128 add_virtual_root_child(dev); 129 186 130 /* Register root device's children. */ 187 131 int res = add_platform_child(dev); … … 189 133 printf(NAME ": failed to add child device for platform.\n"); 190 134 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 197 135 return res; 198 136 } -
uspace/drv/rootpc/Makefile
r101ef25c r243cb86 30 30 LIBS = $(LIBDRV_PREFIX)/libdrv.a 31 31 EXTRA_CFLAGS += -I$(LIBDRV_PREFIX)/include 32 BINARY = root ia3232 BINARY = rootpc 33 33 34 34 SOURCES = \ 35 root ia32.c35 rootpc.c 36 36 37 37 include $(USPACE_PREFIX)/Makefile.common -
uspace/drv/rootpc/rootpc.c
r101ef25c r243cb86 28 28 29 29 /** 30 * @defgroup root_ ia32 Root HW device driver for ia32platform.31 * @brief HelenOS root HW device driver for ia32 platform.30 * @defgroup root_pc Root HW device driver for ia32 and amd64 platform. 31 * @brief HelenOS root HW device driver for ia32 and amd64 platform. 32 32 * @{ 33 33 */ … … 53 53 #include <device/hw_res.h> 54 54 55 #define NAME "root ia32"56 57 typedef struct root ia32_child_dev_data {55 #define NAME "rootpc" 56 57 typedef struct rootpc_child_dev_data { 58 58 hw_resource_list_t hw_resources; 59 } root ia32_child_dev_data_t;60 61 static int root ia32_add_device(device_t *dev);62 static void root_ ia32_init(void);59 } rootpc_child_dev_data_t; 60 61 static int rootpc_add_device(device_t *dev); 62 static void root_pc_init(void); 63 63 64 64 /** The root device driver's standard operations. */ 65 static driver_ops_t root ia32_ops = {66 .add_device = &root ia32_add_device65 static driver_ops_t rootpc_ops = { 66 .add_device = &rootpc_add_device 67 67 }; 68 68 69 69 /** The root device driver structure. */ 70 static driver_t root ia32_driver = {70 static driver_t rootpc_driver = { 71 71 .name = NAME, 72 .driver_ops = &root ia32_ops72 .driver_ops = &rootpc_ops 73 73 }; 74 74 … … 82 82 }; 83 83 84 static root ia32_child_dev_data_t pci_data = {84 static rootpc_child_dev_data_t pci_data = { 85 85 .hw_resources = { 86 86 1, … … 89 89 }; 90 90 91 static hw_resource_list_t *root ia32_get_child_resources(device_t *dev)92 { 93 root ia32_child_dev_data_t *data;94 95 data = (root ia32_child_dev_data_t *) dev->driver_data;91 static hw_resource_list_t *rootpc_get_child_resources(device_t *dev) 92 { 93 rootpc_child_dev_data_t *data; 94 95 data = (rootpc_child_dev_data_t *) dev->driver_data; 96 96 if (NULL == data) 97 97 return NULL; … … 100 100 } 101 101 102 static bool root ia32_enable_child_interrupt(device_t *dev)102 static bool rootpc_enable_child_interrupt(device_t *dev) 103 103 { 104 104 /* TODO */ … … 108 108 109 109 static resource_iface_t child_res_iface = { 110 &root ia32_get_child_resources,111 &root ia32_enable_child_interrupt112 }; 113 114 /* Initialized in root_ ia32_init() function. */115 static device_ops_t root ia32_child_ops;110 &rootpc_get_child_resources, 111 &rootpc_enable_child_interrupt 112 }; 113 114 /* Initialized in root_pc_init() function. */ 115 static device_ops_t rootpc_child_ops; 116 116 117 117 static bool 118 root ia32_add_child(device_t *parent, const char *name, const char *str_match_id,119 root ia32_child_dev_data_t *drv_data)118 rootpc_add_child(device_t *parent, const char *name, const char *str_match_id, 119 rootpc_child_dev_data_t *drv_data) 120 120 { 121 121 printf(NAME ": adding new child device '%s'.\n", name); … … 142 142 143 143 /* Set provided operations to the device. */ 144 child->ops = &root ia32_child_ops;144 child->ops = &rootpc_child_ops; 145 145 146 146 /* Register child device. */ … … 164 164 } 165 165 166 static bool root ia32_add_children(device_t *dev)167 { 168 return root ia32_add_child(dev, "pci0", "intel_pci", &pci_data);166 static bool rootpc_add_children(device_t *dev) 167 { 168 return rootpc_add_child(dev, "pci0", "intel_pci", &pci_data); 169 169 } 170 170 … … 175 175 * @return Zero on success, negative error number otherwise. 176 176 */ 177 static int rootia32_add_device(device_t *dev) 178 { 179 printf(NAME ": rootia32_add_device, device handle = %d\n", dev->handle); 177 static int rootpc_add_device(device_t *dev) 178 { 179 printf(NAME ": rootpc_add_device, device handle = %d\n", 180 (int)dev->handle); 180 181 181 182 /* Register child devices. */ 182 if (!root ia32_add_children(dev)) {183 if (!rootpc_add_children(dev)) { 183 184 printf(NAME ": failed to add child devices for platform " 184 185 "ia32.\n"); … … 188 189 } 189 190 190 static void root_ ia32_init(void)191 { 192 root ia32_child_ops.interfaces[HW_RES_DEV_IFACE] = &child_res_iface;191 static void root_pc_init(void) 192 { 193 rootpc_child_ops.interfaces[HW_RES_DEV_IFACE] = &child_res_iface; 193 194 } 194 195 195 196 int main(int argc, char *argv[]) 196 197 { 197 printf(NAME ": HelenOS root ia32device driver\n");198 root_ ia32_init();199 return driver_main(&root ia32_driver);198 printf(NAME ": HelenOS rootpc device driver\n"); 199 root_pc_init(); 200 return driver_main(&rootpc_driver); 200 201 } 201 202 -
uspace/drv/uhci/Makefile
r101ef25c r243cb86 33 33 34 34 SOURCES = \ 35 main.c 35 main.c \ 36 transfers.c 36 37 37 38 include $(USPACE_PREFIX)/Makefile.common -
uspace/drv/uhci/main.c
r101ef25c r243cb86 27 27 */ 28 28 #include <usb/hcdhubd.h> 29 #include <usb/debug.h> 29 30 #include <errno.h> 31 #include "uhci.h" 30 32 31 static int enqueue_transfer_out(usb_hc_device_t *hc, 32 usb_hcd_attached_device_info_t *dev, usb_hc_endpoint_info_t *endpoint, 33 void *buffer, size_t size, 34 usb_hcd_transfer_callback_out_t callback, void *arg) 35 { 36 printf("UHCI: transfer OUT [%d.%d (%s); %u]\n", 37 dev->address, endpoint->endpoint, 38 usb_str_transfer_type(endpoint->transfer_type), 39 size); 40 return ENOTSUP; 41 } 42 43 static int enqueue_transfer_setup(usb_hc_device_t *hc, 44 usb_hcd_attached_device_info_t *dev, usb_hc_endpoint_info_t *endpoint, 45 void *buffer, size_t size, 46 usb_hcd_transfer_callback_out_t callback, void *arg) 47 { 48 printf("UHCI: transfer SETUP [%d.%d (%s); %u]\n", 49 dev->address, endpoint->endpoint, 50 usb_str_transfer_type(endpoint->transfer_type), 51 size); 52 return ENOTSUP; 53 } 54 55 static int enqueue_transfer_in(usb_hc_device_t *hc, 56 usb_hcd_attached_device_info_t *dev, usb_hc_endpoint_info_t *endpoint, 57 void *buffer, size_t size, 58 usb_hcd_transfer_callback_in_t callback, void *arg) 59 { 60 printf("UHCI: transfer IN [%d.%d (%s); %u]\n", 61 dev->address, endpoint->endpoint, 62 usb_str_transfer_type(endpoint->transfer_type), 63 size); 64 return ENOTSUP; 65 } 66 67 static usb_hcd_transfer_ops_t uhci_transfer_ops = { 68 .transfer_out = enqueue_transfer_out, 69 .transfer_in = enqueue_transfer_in, 70 .transfer_setup = enqueue_transfer_setup 33 static device_ops_t uhci_ops = { 34 .interfaces[USBHC_DEV_IFACE] = &uhci_iface, 71 35 }; 72 36 73 static int uhci_add_ hc(usb_hc_device_t *device)37 static int uhci_add_device(device_t *device) 74 38 { 75 device->transfer_ops = &uhci_transfer_ops; 39 usb_dprintf(NAME, 1, "uhci_add_device() called\n"); 40 device->ops = &uhci_ops; 76 41 77 42 /* 78 43 * We need to announce the presence of our root hub. 79 44 */ 45 usb_dprintf(NAME, 2, "adding root hub\n"); 80 46 usb_hcd_add_root_hub(device); 81 47 … … 83 49 } 84 50 85 usb_hc_driver_t uhci_driver = { 86 .name = "uhci", 87 .add_hc = uhci_add_hc 51 static driver_ops_t uhci_driver_ops = { 52 .add_device = uhci_add_device, 53 }; 54 55 static driver_t uhci_driver = { 56 .name = NAME, 57 .driver_ops = &uhci_driver_ops 88 58 }; 89 59 … … 93 63 * Do some global initializations. 94 64 */ 65 sleep(5); 66 usb_dprintf_enable(NAME, 5); 95 67 96 return usb_hcd_main(&uhci_driver);68 return driver_main(&uhci_driver); 97 69 } -
uspace/drv/uhci/uhci.ma
r101ef25c r243cb86 1 1 10 pci/ven=8086&dev=7020 2 10 usb&hc=uhci 3 10 usb&hc=uhci&hub 2 -
uspace/drv/usbhub/utils.c
r101ef25c r243cb86 33 33 * @brief Hub driver. 34 34 */ 35 #include < usb/hcdhubd.h>35 #include <driver.h> 36 36 #include <usb/devreq.h> 37 37 #include <usbhc_iface.h> 38 #include <usb/usbdrv.h> 38 39 #include <usb/descriptor.h> 39 40 #include <driver.h> … … 41 42 #include <errno.h> 42 43 #include <usb/classes/hub.h> 43 #include " hcdhubd_private.h"44 #include "usbhub.h" 44 45 45 46 static void check_hub_changes(void); … … 108 109 //********************************************* 109 110 110 static void set_hub_address(usb_hc_device_t *hc, usb_address_t address);111 112 111 usb_hcd_hub_info_t * usb_create_hub_info(device_t * device) { 113 112 usb_hcd_hub_info_t* result = (usb_hcd_hub_info_t*) malloc(sizeof (usb_hcd_hub_info_t)); 114 //get parent device115 /// @TODO this code is not correct116 device_t * my_hcd = device;117 while (my_hcd->parent)118 my_hcd = my_hcd->parent;119 //dev->120 printf("%s: owner hcd found: %s\n", hc_driver->name, my_hcd->name);121 //we add the hub into the first hc122 //link_t *link_hc = hc_list.next;123 //usb_hc_device_t *hc = list_get_instance(link_hc,124 // usb_hc_device_t, link);125 //must get generic device info126 127 113 128 114 return result; … … 135 121 */ 136 122 int usb_add_hub_device(device_t *dev) { 137 usb_hc_device_t *hc = list_get_instance(hc_list.next, usb_hc_device_t, link); 138 set_hub_address(hc, 5); 123 printf(NAME ": add_hub_device(handle=%d)\n", (int) dev->handle); 139 124 140 125 check_hub_changes(); … … 145 130 * connected devices. 146 131 */ 147 //insert hub into list148 //find owner hcd149 device_t * my_hcd = dev;150 while (my_hcd->parent)151 my_hcd = my_hcd->parent;152 //dev->153 printf("%s: owner hcd found: %s\n", hc_driver->name, my_hcd->name);154 my_hcd = dev;155 while (my_hcd->parent)156 my_hcd = my_hcd->parent;157 //dev->158 159 printf("%s: owner hcd found: %s\n", hc_driver->name, my_hcd->name);160 132 161 133 //create the hub structure 162 134 usb_hcd_hub_info_t * hub_info = usb_create_hub_info(dev); 163 164 165 //append into the list 166 //we add the hub into the first hc 167 list_append(&hub_info->link, &hc->hubs); 168 169 135 (void)hub_info; 170 136 171 137 return EOK; … … 173 139 } 174 140 175 /** Sample usage of usb_hc_async functions.176 * This function sets hub address using standard SET_ADDRESS request.177 *178 * @warning This function shall be removed once you are familiar with179 * the usb_hc_ API.180 *181 * @param hc Host controller the hub belongs to.182 * @param address New hub address.183 */184 static void set_hub_address(usb_hc_device_t *hc, usb_address_t address) {185 printf("%s: setting hub address to %d\n", hc->generic->name, address);186 usb_target_t target = {0, 0};187 usb_handle_t handle;188 int rc;189 190 usb_device_request_setup_packet_t setup_packet = {191 .request_type = 0,192 .request = USB_DEVREQ_SET_ADDRESS,193 .index = 0,194 .length = 0,195 };196 setup_packet.value = address;197 198 rc = usb_hc_async_control_write_setup(hc, target,199 &setup_packet, sizeof (setup_packet), &handle);200 if (rc != EOK) {201 return;202 }203 204 rc = usb_hc_async_wait_for(handle);205 if (rc != EOK) {206 return;207 }208 209 rc = usb_hc_async_control_write_status(hc, target, &handle);210 if (rc != EOK) {211 return;212 }213 214 rc = usb_hc_async_wait_for(handle);215 if (rc != EOK) {216 return;217 }218 219 printf("%s: hub address changed\n", hc->generic->name);220 }221 141 222 142 /** Check changes on all known hubs. … … 224 144 static void check_hub_changes(void) { 225 145 /* 226 * Iterate through all HCs.146 * Iterate through all hubs. 227 147 */ 228 link_t *link_hc; 229 for (link_hc = hc_list.next; 230 link_hc != &hc_list; 231 link_hc = link_hc->next) { 232 usb_hc_device_t *hc = list_get_instance(link_hc, 233 usb_hc_device_t, link); 234 /* 235 * Iterate through all their hubs. 236 */ 237 link_t *link_hub; 238 for (link_hub = hc->hubs.next; 239 link_hub != &hc->hubs; 240 link_hub = link_hub->next) { 241 usb_hcd_hub_info_t *hub = list_get_instance(link_hub, 242 usb_hcd_hub_info_t, link); 243 244 /* 245 * Check status change pipe of this hub. 246 */ 247 usb_target_t target = { 248 .address = hub->device->address, 249 .endpoint = 1 250 }; 251 252 // FIXME: count properly 253 size_t byte_length = (hub->port_count / 8) + 1; 254 255 void *change_bitmap = malloc(byte_length); 256 size_t actual_size; 257 usb_handle_t handle; 258 259 /* 260 * Send the request. 261 * FIXME: check returned value for possible errors 262 */ 263 usb_hc_async_interrupt_in(hc, target, 264 change_bitmap, byte_length, &actual_size, 265 &handle); 266 267 usb_hc_async_wait_for(handle); 268 269 /* 270 * TODO: handle the changes. 271 */ 148 for (; false; ) { 149 /* 150 * Check status change pipe of this hub. 151 */ 152 usb_target_t target = { 153 .address = 5, 154 .endpoint = 1 155 }; 156 157 size_t port_count = 7; 158 159 /* 160 * Connect to respective HC. 161 */ 162 int hc = usb_drv_hc_connect(NULL, 0); 163 if (hc < 0) { 164 continue; 272 165 } 166 167 // FIXME: count properly 168 size_t byte_length = (port_count / 8) + 1; 169 170 void *change_bitmap = malloc(byte_length); 171 size_t actual_size; 172 usb_handle_t handle; 173 174 /* 175 * Send the request. 176 * FIXME: check returned value for possible errors 177 */ 178 usb_drv_async_interrupt_in(hc, target, 179 change_bitmap, byte_length, &actual_size, 180 &handle); 181 182 usb_drv_async_wait_for(handle); 183 184 /* 185 * TODO: handle the changes. 186 */ 187 188 /* 189 * WARNING: sample code, will not work out of the box. 190 * And does not contain code for checking for errors. 191 */ 192 #if 0 193 /* 194 * Before opening the port, we must acquire the default 195 * address. 196 */ 197 usb_drv_reserve_default_address(hc); 198 199 usb_address_t new_device_address = usb_drv_request_address(hc); 200 201 // TODO: open the port 202 203 // TODO: send request for setting address to new_device_address 204 205 /* 206 * Once new address is set, we can release the default 207 * address. 208 */ 209 usb_drv_release_default_address(hc); 210 211 /* 212 * Obtain descriptors and create match ids for devman. 213 */ 214 215 // TODO: get device descriptors 216 217 // TODO: create match ids 218 219 // TODO: add child device 220 221 // child_device_register sets the device handle 222 // TODO: store it here 223 devman_handle_t new_device_handle = 0; 224 225 /* 226 * Inform the HC that the new device has devman handle 227 * assigned. 228 */ 229 usb_drv_bind_address(hc, new_device_address, new_device_handle); 230 231 /* 232 * That's all. 233 */ 234 #endif 235 236 237 /* 238 * Hang-up the HC-connected phone. 239 */ 240 ipc_hangup(hc); 273 241 } 274 242 } -
uspace/drv/usbkbd/main.c
r101ef25c r243cb86 32 32 #include <fibril.h> 33 33 #include <usb/classes/hid.h> 34 #include <usb/classes/hidparser.h> 35 #include <usb/devreq.h> 34 36 35 37 #define BUFFER_SIZE 32 … … 37 39 38 40 static const usb_endpoint_t CONTROL_EP = 0; 41 42 /* 43 * Callbacks for parser 44 */ 45 static void usbkbd_process_keycodes(const uint16_t *key_codes, size_t count, 46 void *arg) 47 { 48 49 } 50 51 /* 52 * Kbd functions 53 */ 54 static int usbkbd_get_descriptors() 55 { 56 // copy-pasted: 57 58 /* Prepare the setup packet. */ 59 usb_device_request_setup_packet_t setup_packet = { 60 .request_type = 128, 61 .request = USB_DEVREQ_GET_DESCRIPTOR, 62 .index = 0, 63 .length = sizeof(usb_standard_device_descriptor_t) 64 }; 65 66 setup_packet.value_high = USB_DESCTYPE_DEVICE; 67 setup_packet.value_low = 0; 68 69 /* Prepare local descriptor. */ 70 size_t actually_transferred = 0; 71 usb_standard_device_descriptor_t descriptor_tmp; 72 73 /* Perform the control read transaction. */ 74 int rc = usb_drv_psync_control_read(phone, target, 75 &setup_packet, sizeof(setup_packet), 76 &descriptor_tmp, sizeof(descriptor_tmp), &actually_transferred); 77 78 if (rc != EOK) { 79 return rc; 80 } 81 82 // end of copy-paste 83 } 39 84 40 85 static usb_hid_dev_kbd_t *usbkbd_init_device(device_t *dev) … … 68 113 69 114 // TODO: get descriptors 70 115 usbkbd_get_descriptors(); 71 116 // TODO: parse descriptors and save endpoints 72 117 … … 75 120 76 121 static void usbkbd_process_interrupt_in(usb_hid_dev_kbd_t *kbd_dev, 77 char*buffer, size_t actual_size)122 uint8_t *buffer, size_t actual_size) 78 123 { 79 124 /* … … 81 126 * now only take last 6 bytes and process, i.e. send to kbd 82 127 */ 128 129 usb_hid_report_in_callbacks_t *callbacks = 130 (usb_hid_report_in_callbacks_t *)malloc( 131 sizeof(usb_hid_report_in_callbacks_t)); 132 callbacks->keyboard = usbkbd_process_keycodes; 133 134 usb_hid_parse_report(kbd_dev->parser, buffer, callbacks, NULL); 83 135 } 84 136 … … 87 139 int rc; 88 140 usb_handle_t handle; 89 charbuffer[BUFFER_SIZE];141 uint8_t buffer[BUFFER_SIZE]; 90 142 size_t actual_size; 91 143 //usb_endpoint_t poll_endpoint = 1; -
uspace/drv/vhc/conn.h
r101ef25c r243cb86 38 38 #include <usb/usb.h> 39 39 #include <usb/hcdhubd.h> 40 #include <usbhc_iface.h> 40 41 #include "vhcd.h" 41 42 #include "devices.h" … … 44 45 45 46 usb_hcd_transfer_ops_t vhc_transfer_ops; 47 usbhc_iface_t vhc_iface; 48 49 void address_init(void); 50 46 51 47 52 void default_connection_handler(device_t *, ipc_callid_t, ipc_call_t *); -
uspace/drv/vhc/connhost.c
r101ef25c r243cb86 36 36 #include <errno.h> 37 37 #include <usb/usb.h> 38 #include <usb/hcd.h> 38 39 39 40 #include "vhcd.h" … … 43 44 typedef struct { 44 45 usb_direction_t direction; 45 usb _hcd_transfer_callback_out_t out_callback;46 usb _hcd_transfer_callback_in_t in_callback;47 usb_hc_device_t *hc;46 usbhc_iface_transfer_out_callback_t out_callback; 47 usbhc_iface_transfer_in_callback_t in_callback; 48 device_t *dev; 48 49 void *arg; 49 50 } transfer_info_t; … … 56 57 switch (transfer->direction) { 57 58 case USB_DIRECTION_IN: 58 transfer->in_callback(transfer-> hc,59 size, outcome,59 transfer->in_callback(transfer->dev, 60 outcome, size, 60 61 transfer->arg); 61 62 break; 62 63 case USB_DIRECTION_OUT: 63 transfer->out_callback(transfer-> hc,64 transfer->out_callback(transfer->dev, 64 65 outcome, 65 66 transfer->arg); … … 73 74 } 74 75 75 static transfer_info_t *create_transfer_info( usb_hc_device_t *hc,76 static transfer_info_t *create_transfer_info(device_t *dev, 76 77 usb_direction_t direction, void *arg) 77 78 { … … 82 83 transfer->out_callback = NULL; 83 84 transfer->arg = arg; 84 transfer-> hc = hc;85 transfer->dev = dev; 85 86 86 87 return transfer; 87 88 } 88 89 89 static int enqueue_transfer_out( usb_hc_device_t *hc,90 usb_ hcd_attached_device_info_t *dev, usb_hc_endpoint_info_t *endpoint,90 static int enqueue_transfer_out(device_t *dev, 91 usb_target_t target, usb_transfer_type_t transfer_type, 91 92 void *buffer, size_t size, 92 usb _hcd_transfer_callback_out_t callback, void *arg)93 { 94 printf(NAME ": transfer OUT [%d.%d (%s); % u]\n",95 dev->address, endpoint->endpoint,96 usb_str_transfer_type( endpoint->transfer_type),93 usbhc_iface_transfer_out_callback_t callback, void *arg) 94 { 95 printf(NAME ": transfer OUT [%d.%d (%s); %zu]\n", 96 target.address, target.endpoint, 97 usb_str_transfer_type(transfer_type), 97 98 size); 98 99 99 100 transfer_info_t *transfer 100 = create_transfer_info( hc, USB_DIRECTION_OUT, arg);101 = create_transfer_info(dev, USB_DIRECTION_OUT, arg); 101 102 transfer->out_callback = callback; 102 103 usb_target_t target = {104 .address = dev->address,105 .endpoint = endpoint->endpoint106 };107 103 108 104 hc_add_transaction_to_device(false, target, buffer, size, … … 112 108 } 113 109 114 static int enqueue_transfer_setup( usb_hc_device_t *hc,115 usb_ hcd_attached_device_info_t *dev, usb_hc_endpoint_info_t *endpoint,110 static int enqueue_transfer_setup(device_t *dev, 111 usb_target_t target, usb_transfer_type_t transfer_type, 116 112 void *buffer, size_t size, 117 usb _hcd_transfer_callback_out_t callback, void *arg)118 { 119 printf(NAME ": transfer SETUP [%d.%d (%s); % u]\n",120 dev->address, endpoint->endpoint,121 usb_str_transfer_type( endpoint->transfer_type),113 usbhc_iface_transfer_out_callback_t callback, void *arg) 114 { 115 printf(NAME ": transfer SETUP [%d.%d (%s); %zu]\n", 116 target.address, target.endpoint, 117 usb_str_transfer_type(transfer_type), 122 118 size); 123 119 124 120 transfer_info_t *transfer 125 = create_transfer_info( hc, USB_DIRECTION_OUT, arg);121 = create_transfer_info(dev, USB_DIRECTION_OUT, arg); 126 122 transfer->out_callback = callback; 127 128 usb_target_t target = {129 .address = dev->address,130 .endpoint = endpoint->endpoint131 };132 123 133 124 hc_add_transaction_to_device(true, target, buffer, size, … … 137 128 } 138 129 139 static int enqueue_transfer_in( usb_hc_device_t *hc,140 usb_ hcd_attached_device_info_t *dev, usb_hc_endpoint_info_t *endpoint,130 static int enqueue_transfer_in(device_t *dev, 131 usb_target_t target, usb_transfer_type_t transfer_type, 141 132 void *buffer, size_t size, 142 usb _hcd_transfer_callback_in_t callback, void *arg)143 { 144 printf(NAME ": transfer IN [%d.%d (%s); % u]\n",145 dev->address, endpoint->endpoint,146 usb_str_transfer_type( endpoint->transfer_type),133 usbhc_iface_transfer_in_callback_t callback, void *arg) 134 { 135 printf(NAME ": transfer IN [%d.%d (%s); %zu]\n", 136 target.address, target.endpoint, 137 usb_str_transfer_type(transfer_type), 147 138 size); 148 139 149 140 transfer_info_t *transfer 150 = create_transfer_info( hc, USB_DIRECTION_IN, arg);141 = create_transfer_info(dev, USB_DIRECTION_IN, arg); 151 142 transfer->in_callback = callback; 152 153 usb_target_t target = {154 .address = dev->address,155 .endpoint = endpoint->endpoint156 };157 143 158 144 hc_add_transaction_from_device(target, buffer, size, … … 163 149 164 150 165 usb_hcd_transfer_ops_t vhc_transfer_ops = { 166 .transfer_out = enqueue_transfer_out, 167 .transfer_in = enqueue_transfer_in, 168 .transfer_setup = enqueue_transfer_setup 151 static int interrupt_out(device_t *dev, usb_target_t target, 152 void *data, size_t size, 153 usbhc_iface_transfer_out_callback_t callback, void *arg) 154 { 155 return enqueue_transfer_out(dev, target, USB_TRANSFER_INTERRUPT, 156 data, size, 157 callback, arg); 158 } 159 160 static int interrupt_in(device_t *dev, usb_target_t target, 161 void *data, size_t size, 162 usbhc_iface_transfer_in_callback_t callback, void *arg) 163 { 164 return enqueue_transfer_in(dev, target, USB_TRANSFER_INTERRUPT, 165 data, size, 166 callback, arg); 167 } 168 169 static int control_write_setup(device_t *dev, usb_target_t target, 170 void *data, size_t size, 171 usbhc_iface_transfer_out_callback_t callback, void *arg) 172 { 173 return enqueue_transfer_setup(dev, target, USB_TRANSFER_CONTROL, 174 data, size, 175 callback, arg); 176 } 177 178 static int control_write_data(device_t *dev, usb_target_t target, 179 void *data, size_t size, 180 usbhc_iface_transfer_out_callback_t callback, void *arg) 181 { 182 return enqueue_transfer_out(dev, target, USB_TRANSFER_CONTROL, 183 data, size, 184 callback, arg); 185 } 186 187 static int control_write_status(device_t *dev, usb_target_t target, 188 usbhc_iface_transfer_in_callback_t callback, void *arg) 189 { 190 return enqueue_transfer_in(dev, target, USB_TRANSFER_CONTROL, 191 NULL, 0, 192 callback, arg); 193 } 194 195 static int control_read_setup(device_t *dev, usb_target_t target, 196 void *data, size_t size, 197 usbhc_iface_transfer_out_callback_t callback, void *arg) 198 { 199 return enqueue_transfer_setup(dev, target, USB_TRANSFER_CONTROL, 200 data, size, 201 callback, arg); 202 } 203 204 static int control_read_data(device_t *dev, usb_target_t target, 205 void *data, size_t size, 206 usbhc_iface_transfer_in_callback_t callback, void *arg) 207 { 208 return enqueue_transfer_in(dev, target, USB_TRANSFER_CONTROL, 209 data, size, 210 callback, arg); 211 } 212 213 static int control_read_status(device_t *dev, usb_target_t target, 214 usbhc_iface_transfer_out_callback_t callback, void *arg) 215 { 216 return enqueue_transfer_out(dev, target, USB_TRANSFER_CONTROL, 217 NULL, 0, 218 callback, arg); 219 } 220 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 276 usbhc_iface_t vhc_iface = { 277 .tell_address = tell_address, 278 279 .reserve_default_address = reserve_default_address, 280 .release_default_address = release_default_address, 281 .request_address = request_address, 282 .bind_address = bind_address, 283 .release_address = release_address, 284 285 .interrupt_out = interrupt_out, 286 .interrupt_in = interrupt_in, 287 288 .control_write_setup = control_write_setup, 289 .control_write_data = control_write_data, 290 .control_write_status = control_write_status, 291 292 .control_read_setup = control_read_setup, 293 .control_read_data = control_read_data, 294 .control_read_status = control_read_status 169 295 }; 170 296 -
uspace/drv/vhc/debug.c
r101ef25c r243cb86 35 35 #include <stdio.h> 36 36 #include <ipc/ipc.h> 37 #include <usb/debug.h> 37 38 38 39 #include "vhcd.h" 39 40 40 /** Current debug level. */41 int debug_level = 0;42 43 /** Debugging printf.44 * This function is intended for single-line messages as it45 * automatically prints debugging prefix at the beginning of the46 * line.47 *48 * @see printf49 * @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 }64 41 65 42 /** Debug print informing of invalid call. -
uspace/drv/vhc/hcd.c
r101ef25c r243cb86 52 52 #include "conn.h" 53 53 54 static device_ops_t vhc_ops = { 55 .interfaces[USBHC_DEV_IFACE] = &vhc_iface, 56 .default_handler = default_connection_handler 57 }; 54 58 55 59 static int vhc_count = 0; 56 static int vhc_add_device( usb_hc_device_t *dev)60 static int vhc_add_device(device_t *dev) 57 61 { 58 62 /* … … 65 69 vhc_count++; 66 70 67 dev->transfer_ops = &vhc_transfer_ops; 68 dev->generic->ops->default_handler = default_connection_handler; 71 dev->ops = &vhc_ops; 72 73 /* 74 * Initialize address management. 75 */ 76 address_init(); 69 77 70 78 /* 71 79 * Initialize our hub and announce its presence. 72 80 */ 73 hub_init(); 74 usb_hcd_add_root_hub(dev); 81 hub_init(dev); 75 82 76 83 printf("%s: virtual USB host controller ready.\n", NAME); … … 79 86 } 80 87 81 static usb_hc_driver_t vhc_driver = { 88 static driver_ops_t vhc_driver_ops = { 89 .add_device = vhc_add_device, 90 }; 91 92 static driver_t vhc_driver = { 82 93 .name = NAME, 83 . add_hc = &vhc_add_device94 .driver_ops = &vhc_driver_ops 84 95 }; 85 96 … … 99 110 printf("%s: virtual USB host controller driver.\n", NAME); 100 111 101 debug_level = 10;112 usb_dprintf_enable(NAME, 10); 102 113 103 114 fid_t fid = fibril_create(hc_manager_fibril, NULL); … … 114 125 sleep(4); 115 126 116 return usb_hcd_main(&vhc_driver);127 return driver_main(&vhc_driver); 117 128 } 118 129 -
uspace/drv/vhc/hub.c
r101ef25c r243cb86 37 37 #include <usbvirt/device.h> 38 38 #include <errno.h> 39 #include <str_error.h> 39 40 #include <stdlib.h> 41 #include <driver.h> 40 42 41 43 #include "vhcd.h" 42 44 #include "hub.h" 43 45 #include "hubintern.h" 46 #include "conn.h" 44 47 45 48 … … 148 151 hub_device_t hub_dev; 149 152 153 static usb_address_t hub_set_address(usbvirt_device_t *hub) 154 { 155 usb_address_t new_address; 156 int rc = vhc_iface.request_address(NULL, &new_address); 157 if (rc != EOK) { 158 return rc; 159 } 160 161 usb_device_request_setup_packet_t setup_packet = { 162 .request_type = 0, 163 .request = USB_DEVREQ_SET_ADDRESS, 164 .index = 0, 165 .length = 0, 166 }; 167 setup_packet.value = new_address; 168 169 hub->transaction_setup(hub, 0, &setup_packet, sizeof(setup_packet)); 170 hub->transaction_in(hub, 0, NULL, 0, NULL); 171 172 return new_address; 173 } 174 150 175 /** Initialize virtual hub. */ 151 void hub_init( void)176 void hub_init(device_t *hc_dev) 152 177 { 153 178 size_t i; … … 163 188 164 189 dprintf(1, "virtual hub (%d ports) created", HUB_PORT_COUNT); 190 191 usb_address_t hub_address = hub_set_address(&virthub_dev); 192 if (hub_address < 0) { 193 dprintf(1, "problem changing hub address (%s)", 194 str_error(hub_address)); 195 } 196 197 dprintf(2, "virtual hub address changed to %d", hub_address); 198 199 char *id; 200 int rc = asprintf(&id, "usb&hub"); 201 if (rc <= 0) { 202 return; 203 } 204 devman_handle_t hub_handle; 205 rc = child_device_register_wrapper(hc_dev, "hub", id, 10, &hub_handle); 206 if (rc != EOK) { 207 free(id); 208 } 209 210 vhc_iface.bind_address(NULL, hub_address, hub_handle); 211 212 dprintf(2, "virtual hub has devman handle %d", (int) hub_handle); 165 213 } 166 214 -
uspace/drv/vhc/hub.h
r101ef25c r243cb86 37 37 38 38 #include <usbvirt/device.h> 39 #include <driver.h> 39 40 40 41 #include "devices.h" … … 47 48 extern usbvirt_device_t virthub_dev; 48 49 49 void hub_init( void);50 void hub_init(device_t *); 50 51 size_t hub_add_device(virtdev_connection_t *); 51 52 void hub_remove_device(virtdev_connection_t *); -
uspace/drv/vhc/vhc.ma
r101ef25c r243cb86 1 1 10 usb&hc=vhc 2 10 usb&hc=vhc&hub 2 -
uspace/drv/vhc/vhcd.h
r101ef25c r243cb86 36 36 #define VHCD_VHCD_H_ 37 37 38 #include <usb/debug.h> 39 38 40 #define NAME "vhc" 39 41 #define NAME_DEV "hcd-virt-dev" … … 43 45 #define DEVMAP_PATH_DEV NAMESPACE "/" NAME_DEV 44 46 45 extern int debug_level; 46 void dprintf(int, const char *, ...); 47 #define dprintf(level, format, ...) \ 48 usb_dprintf(NAME, (level), format "\n", ##__VA_ARGS__) 47 49 void dprintf_inval_call(int, ipc_call_t, ipcarg_t); 48 50 -
uspace/lib/block/libblock.c
r101ef25c r243cb86 66 66 fibril_mutex_t lock; 67 67 size_t lblock_size; /**< Logical block size. */ 68 unsigned blocks_cluster; /**< Physical blocks per block_t */ 68 69 unsigned block_count; /**< Total number of blocks. */ 69 70 unsigned blocks_cached; /**< Number of cached blocks. */ … … 90 91 static int get_block_size(int dev_phone, size_t *bsize); 91 92 static int get_num_blocks(int dev_phone, aoff64_t *nblocks); 93 static aoff64_t ba_ltop(devcon_t *devcon, aoff64_t lba); 92 94 93 95 static devcon_t *devcon_search(devmap_handle_t devmap_handle) … … 259 261 { 260 262 block_t *b = hash_table_get_instance(item, block_t, hash_link); 261 return b-> boff== *key;263 return b->lba == *key; 262 264 } 263 265 … … 292 294 cache->mode = mode; 293 295 294 /* No block size translation a.t.m. */ 295 assert(cache->lblock_size == devcon->pblock_size); 296 /* Allow 1:1 or small-to-large block size translation */ 297 if (cache->lblock_size % devcon->pblock_size != 0) 298 return ENOTSUP; 299 300 cache->blocks_cluster = cache->lblock_size / devcon->pblock_size; 296 301 297 302 if (!hash_table_create(&cache->block_hash, CACHE_BUCKETS, 1, … … 329 334 if (b->dirty) { 330 335 memcpy(devcon->comm_area, b->data, b->size); 331 rc = write_blocks(devcon, b-> boff, 1);336 rc = write_blocks(devcon, b->pba, cache->blocks_cluster); 332 337 if (rc != EOK) 333 338 return rc; 334 339 } 335 340 336 unsigned long key = b-> boff;341 unsigned long key = b->lba; 337 342 hash_table_remove(&cache->block_hash, &key, 1); 338 343 … … 375 380 * block pointer on success. 376 381 * @param devmap_handle Device handle of the block device. 377 * @param b off Block offset.382 * @param ba Block address (logical). 378 383 * @param flags If BLOCK_FLAGS_NOREAD is specified, block_get() 379 384 * will not read the contents of the block from the … … 382 387 * @return EOK on success or a negative error code. 383 388 */ 384 int block_get(block_t **block, devmap_handle_t devmap_handle, aoff64_t b off, int flags)389 int block_get(block_t **block, devmap_handle_t devmap_handle, aoff64_t ba, int flags) 385 390 { 386 391 devcon_t *devcon; … … 388 393 block_t *b; 389 394 link_t *l; 390 unsigned long key = b off;395 unsigned long key = ba; 391 396 int rc; 392 397 … … 465 470 fibril_mutex_lock(&devcon->comm_area_lock); 466 471 memcpy(devcon->comm_area, b->data, b->size); 467 rc = write_blocks(devcon, b->boff, 1); 472 rc = write_blocks(devcon, b->pba, 473 cache->blocks_cluster); 468 474 fibril_mutex_unlock(&devcon->comm_area_lock); 469 475 if (rc != EOK) { … … 495 501 */ 496 502 list_remove(&b->free_link); 497 temp_key = b-> boff;503 temp_key = b->lba; 498 504 hash_table_remove(&cache->block_hash, &temp_key, 1); 499 505 } … … 502 508 b->devmap_handle = devmap_handle; 503 509 b->size = cache->lblock_size; 504 b->boff = boff; 510 b->lba = ba; 511 b->pba = ba_ltop(devcon, b->lba); 505 512 hash_table_insert(&cache->block_hash, &key, &b->hash_link); 506 513 … … 519 526 */ 520 527 fibril_mutex_lock(&devcon->comm_area_lock); 521 rc = read_blocks(devcon, b-> boff, 1);528 rc = read_blocks(devcon, b->pba, cache->blocks_cluster); 522 529 memcpy(b->data, devcon->comm_area, cache->lblock_size); 523 530 fibril_mutex_unlock(&devcon->comm_area_lock); … … 580 587 fibril_mutex_lock(&devcon->comm_area_lock); 581 588 memcpy(devcon->comm_area, block->data, block->size); 582 rc = write_blocks(devcon, block-> boff, 1);589 rc = write_blocks(devcon, block->pba, cache->blocks_cluster); 583 590 fibril_mutex_unlock(&devcon->comm_area_lock); 584 591 block->dirty = false; … … 614 621 * Take the block out of the cache and free it. 615 622 */ 616 unsigned long key = block-> boff;623 unsigned long key = block->lba; 617 624 hash_table_remove(&cache->block_hash, &key, 1); 618 625 free(block); … … 712 719 * 713 720 * @param devmap_handle Device handle of the block device. 714 * @param ba Address of first block .721 * @param ba Address of first block (physical). 715 722 * @param cnt Number of blocks. 716 723 * @param src Buffer for storing the data. … … 740 747 * 741 748 * @param devmap_handle Device handle of the block device. 742 * @param ba Address of first block .749 * @param ba Address of first block (physical). 743 750 * @param cnt Number of blocks. 744 751 * @param src The data to be written. … … 879 886 } 880 887 888 /** Convert logical block address to physical block address. */ 889 static aoff64_t ba_ltop(devcon_t *devcon, aoff64_t lba) 890 { 891 assert(devcon->cache != NULL); 892 return lba * devcon->cache->blocks_cluster; 893 } 894 881 895 /** @} 882 896 */ -
uspace/lib/block/libblock.h
r101ef25c r243cb86 73 73 /** Handle of the device where the block resides. */ 74 74 devmap_handle_t devmap_handle; 75 /** Block offset on the block device. Counted in 'size'-byte blocks. */ 76 aoff64_t boff; 75 /** Logical block address */ 76 aoff64_t lba; 77 /** Physical block address */ 78 aoff64_t pba; 77 79 /** Size of the block. */ 78 80 size_t size; -
uspace/lib/c/generic/adt/char_map.c
r101ef25c r243cb86 90 90 } 91 91 92 map->items[map->next]->c = * 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) && 145 ((length) || (*identifier))) { 144 if (char_map_is_valid(map) && identifier && (length || *identifier)) { 146 145 int index; 147 146 148 for (index = 0; index < map->next; ++ index) {147 for (index = 0; index < map->next; index++) { 149 148 if (map->items[index]->c != *identifier) 150 149 continue; 151 150 152 ++ identifier;153 if((length > 1) || ((length == 0) && (*identifier))) {151 identifier++; 152 if((length > 1) || ((length == 0) && *identifier)) { 154 153 return char_map_add(map->items[index], 155 154 identifier, length ? length - 1 : 0, value); … … 178 177 179 178 map->magic = 0; 180 for (index = 0; index < map->next; ++index)179 for (index = 0; index < map->next; index++) 181 180 char_map_destroy(map->items[index]); 182 181 … … 207 206 return NULL; 208 207 209 if (length || (*identifier)) {208 if (length || *identifier) { 210 209 int index; 211 210 212 for (index = 0; index < map->next; ++index) {211 for (index = 0; index < map->next; index++) { 213 212 if (map->items[index]->c == *identifier) { 214 ++identifier;213 identifier++; 215 214 if (length == 1) 216 215 return map->items[index]; -
uspace/lib/c/generic/devman.c
r101ef25c r243cb86 116 116 { 117 117 ipc_call_t answer; 118 a sync_send_1(phone, DEVMAN_ADD_MATCH_ID, match_id->score, &answer);118 aid_t req = 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 return retval; 120 async_wait_for(req, NULL); 121 return retval; 121 122 } 122 123 -
uspace/lib/c/include/adt/generic_field.h
r101ef25c r243cb86 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
r101ef25c r243cb86 83 83 #define ENOTCONN (-10057) 84 84 85 /** The requested operation was not performed. 86 * Try again later. 87 */ 88 #define TRY_AGAIN (-11002) 85 /** The requested operation was not performed. Try again later. */ 86 #define EAGAIN (-11002) 89 87 90 88 /** No data. -
uspace/lib/c/include/ipc/dev_iface.h
r101ef25c r243cb86 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 used 58 * 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 56 66 57 67 #endif -
uspace/lib/c/include/ipc/vfs.h
r101ef25c r243cb86 36 36 #define LIBC_IPC_VFS_H_ 37 37 38 #include <ipc/ipc.h> 38 39 #include <sys/types.h> 39 #include < ipc/ipc.h>40 #include <bool.h> 40 41 41 42 #define FS_NAME_MAXLEN 20 … … 55 56 /** Unique identifier of the fs. */ 56 57 char name[FS_NAME_MAXLEN + 1]; 58 bool concurrent_read_write; 59 bool write_retains_size; 57 60 } vfs_info_t; 58 61 -
uspace/lib/drv/generic/driver.c
r101ef25c r243cb86 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 devman_handle_t *child_handle) 394 { 395 device_t *child = NULL; 396 match_id_t *match_id = NULL; 397 int rc; 398 399 child = create_device(); 400 if (child == NULL) { 401 rc = ENOMEM; 402 goto failure; 403 } 404 405 child->name = child_name; 406 407 match_id = create_match_id(); 408 if (match_id == NULL) { 409 rc = ENOMEM; 410 goto failure; 411 } 412 413 match_id->id = child_match_id; 414 match_id->score = child_match_score; 415 add_match_id(&child->match_ids, match_id); 416 417 rc = child_device_register(child, parent); 418 if (EOK != rc) 419 goto failure; 420 421 if (child_handle != NULL) { 422 *child_handle = child->handle; 423 } 424 return EOK; 425 426 failure: 427 if (match_id != NULL) { 428 match_id->id = NULL; 429 delete_match_id(match_id); 430 } 431 432 if (child != NULL) { 433 child->name = NULL; 434 delete_device(child); 435 } 436 437 return rc; 438 } 439 383 440 int driver_main(driver_t *drv) 384 441 { -
uspace/lib/drv/generic/remote_usbhc.c
r101ef25c r243cb86 52 52 static void remote_usbhc_control_read_data(device_t *, void *, ipc_callid_t, ipc_call_t *); 53 53 static void remote_usbhc_control_read_status(device_t *, void *, ipc_callid_t, ipc_call_t *); 54 static void remote_usbhc_reserve_default_address(device_t *, void *, ipc_callid_t, ipc_call_t *); 55 static void remote_usbhc_release_default_address(device_t *, void *, ipc_callid_t, ipc_call_t *); 56 static void remote_usbhc_request_address(device_t *, void *, ipc_callid_t, ipc_call_t *); 57 static void remote_usbhc_bind_address(device_t *, void *, ipc_callid_t, ipc_call_t *); 58 static void remote_usbhc_release_address(device_t *, void *, ipc_callid_t, ipc_call_t *); 54 59 //static void remote_usbhc(device_t *, void *, ipc_callid_t, ipc_call_t *); 55 60 … … 57 62 static remote_iface_func_ptr_t remote_usbhc_iface_ops [] = { 58 63 remote_usbhc_get_address, 64 59 65 remote_usbhc_get_buffer, 66 67 remote_usbhc_reserve_default_address, 68 remote_usbhc_release_default_address, 69 70 remote_usbhc_request_address, 71 remote_usbhc_bind_address, 72 remote_usbhc_release_address, 73 60 74 remote_usbhc_interrupt_out, 61 75 remote_usbhc_interrupt_in, 76 62 77 remote_usbhc_control_write_setup, 63 78 remote_usbhc_control_write_data, 64 79 remote_usbhc_control_write_status, 80 65 81 remote_usbhc_control_read_setup, 66 82 remote_usbhc_control_read_data, … … 92 108 } 93 109 94 devman_handle_t handle = IPC_GET_ARG1(*call);110 devman_handle_t handle = DEV_IPC_GET_ARG1(*call); 95 111 96 112 usb_address_t address; … … 106 122 ipc_callid_t callid, ipc_call_t *call) 107 123 { 108 ipcarg_t buffer_hash = IPC_GET_ARG1(*call);124 ipcarg_t buffer_hash = DEV_IPC_GET_ARG1(*call); 109 125 async_transaction_t * trans = (async_transaction_t *)buffer_hash; 110 126 if (trans == NULL) { … … 128 144 accepted_size = trans->size; 129 145 } 130 async_data_read_finalize(c allid, trans->buffer, accepted_size);146 async_data_read_finalize(cid, trans->buffer, accepted_size); 131 147 132 148 ipc_answer_1(callid, EOK, accepted_size); … … 134 150 free(trans->buffer); 135 151 free(trans); 152 } 153 154 void remote_usbhc_reserve_default_address(device_t *device, void *iface, 155 ipc_callid_t callid, ipc_call_t *call) 156 { 157 usbhc_iface_t *usb_iface = (usbhc_iface_t *) iface; 158 159 if (!usb_iface->reserve_default_address) { 160 ipc_answer_0(callid, ENOTSUP); 161 return; 162 } 163 164 int rc = usb_iface->reserve_default_address(device); 165 166 ipc_answer_0(callid, rc); 167 } 168 169 void remote_usbhc_release_default_address(device_t *device, void *iface, 170 ipc_callid_t callid, ipc_call_t *call) 171 { 172 usbhc_iface_t *usb_iface = (usbhc_iface_t *) iface; 173 174 if (!usb_iface->release_default_address) { 175 ipc_answer_0(callid, ENOTSUP); 176 return; 177 } 178 179 int rc = usb_iface->release_default_address(device); 180 181 ipc_answer_0(callid, rc); 182 } 183 184 void remote_usbhc_request_address(device_t *device, void *iface, 185 ipc_callid_t callid, ipc_call_t *call) 186 { 187 usbhc_iface_t *usb_iface = (usbhc_iface_t *) iface; 188 189 if (!usb_iface->request_address) { 190 ipc_answer_0(callid, ENOTSUP); 191 return; 192 } 193 194 usb_address_t address; 195 int rc = usb_iface->request_address(device, &address); 196 if (rc != EOK) { 197 ipc_answer_0(callid, rc); 198 } else { 199 ipc_answer_1(callid, EOK, (ipcarg_t) address); 200 } 201 } 202 203 void remote_usbhc_bind_address(device_t *device, void *iface, 204 ipc_callid_t callid, ipc_call_t *call) 205 { 206 usbhc_iface_t *usb_iface = (usbhc_iface_t *) iface; 207 208 if (!usb_iface->bind_address) { 209 ipc_answer_0(callid, ENOTSUP); 210 return; 211 } 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); 215 216 int rc = usb_iface->bind_address(device, address, handle); 217 218 ipc_answer_0(callid, rc); 219 } 220 221 void remote_usbhc_release_address(device_t *device, void *iface, 222 ipc_callid_t callid, ipc_call_t *call) 223 { 224 usbhc_iface_t *usb_iface = (usbhc_iface_t *) iface; 225 226 if (!usb_iface->release_address) { 227 ipc_answer_0(callid, ENOTSUP); 228 return; 229 } 230 231 usb_address_t address = (usb_address_t) DEV_IPC_GET_ARG1(*call); 232 233 int rc = usb_iface->release_address(device, address); 234 235 ipc_answer_0(callid, rc); 136 236 } 137 237 … … 175 275 } 176 276 177 size_t expected_len = IPC_GET_ARG3(*call);277 size_t expected_len = DEV_IPC_GET_ARG3(*call); 178 278 usb_target_t target = { 179 .address = IPC_GET_ARG1(*call),180 .endpoint = IPC_GET_ARG2(*call)279 .address = DEV_IPC_GET_ARG1(*call), 280 .endpoint = DEV_IPC_GET_ARG2(*call) 181 281 }; 182 282 … … 227 327 } 228 328 229 size_t len = IPC_GET_ARG3(*call);329 size_t len = DEV_IPC_GET_ARG3(*call); 230 330 usb_target_t target = { 231 .address = IPC_GET_ARG1(*call),232 .endpoint = IPC_GET_ARG2(*call)331 .address = DEV_IPC_GET_ARG1(*call), 332 .endpoint = DEV_IPC_GET_ARG2(*call) 233 333 }; 234 334 … … 284 384 285 385 usb_target_t target = { 286 .address = IPC_GET_ARG1(*call),287 .endpoint = IPC_GET_ARG2(*call)386 .address = DEV_IPC_GET_ARG1(*call), 387 .endpoint = DEV_IPC_GET_ARG2(*call) 288 388 }; 289 389 -
uspace/lib/drv/include/driver.h
r101ef25c r243cb86 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 devman_handle_t *); 201 203 202 204 -
uspace/lib/drv/include/usbhc_iface.h
r101ef25c r243cb86 111 111 112 112 113 /** Reserve usage of default address. 114 * This call informs the host controller that the caller will be 115 * using default USB address. It is duty of the HC driver to ensure 116 * that only single entity will have it reserved. 117 * The address is returned via IPC_M_USBHC_RELEASE_DEFAULT_ADDRESS. 118 * The caller can start using the address after receiving EOK 119 * answer. 120 */ 121 IPC_M_USBHC_RESERVE_DEFAULT_ADDRESS, 122 123 /** Release usage of default address. 124 * @see IPC_M_USBHC_RESERVE_DEFAULT_ADDRESS 125 */ 126 IPC_M_USBHC_RELEASE_DEFAULT_ADDRESS, 127 128 /** Asks for address assignment by host controller. 129 * Answer: 130 * - ELIMIT - host controller run out of address 131 * - EOK - address assigned 132 * Answer arguments: 133 * - assigned address 134 * 135 * The address must be released by via IPC_M_USBHC_RELEASE_ADDRESS. 136 */ 137 IPC_M_USBHC_REQUEST_ADDRESS, 138 139 /** Bind USB address with devman handle. 140 * Parameters: 141 * - USB address 142 * - devman handle 143 * Answer: 144 * - EOK - address binded 145 * - ENOENT - address is not in use 146 */ 147 IPC_M_USBHC_BIND_ADDRESS, 148 149 /** Release address in use. 150 * Arguments: 151 * - address to be released 152 * Answer: 153 * - ENOENT - address not in use 154 * - EPERM - trying to release default USB address 155 */ 156 IPC_M_USBHC_RELEASE_ADDRESS, 157 158 113 159 /** Send interrupt data to device. 114 160 * See explanation at usb_iface_funcs_t (OUT transaction). … … 183 229 typedef struct { 184 230 int (*tell_address)(device_t *, devman_handle_t, usb_address_t *); 231 232 int (*reserve_default_address)(device_t *); 233 int (*release_default_address)(device_t *); 234 int (*request_address)(device_t *, usb_address_t *); 235 int (*bind_address)(device_t *, usb_address_t, devman_handle_t); 236 int (*release_address)(device_t *, usb_address_t); 185 237 186 238 usbhc_iface_transfer_out_t interrupt_out; -
uspace/lib/usb/Makefile
r101ef25c r243cb86 33 33 34 34 SOURCES = \ 35 src/addrkeep.c \ 36 src/debug.c \ 37 src/drvpsync.c \ 35 38 src/hcdhubd.c \ 36 39 src/hcdrv.c \ 37 src/h ubdrv.c \40 src/hidparser.c \ 38 41 src/localdrv.c \ 39 42 src/remotedrv.c \ 40 43 src/usb.c \ 44 src/usbdrvreq.c \ 41 45 src/usbdrv.c 42 46 -
uspace/lib/usb/include/usb/classes/hid.h
r101ef25c r243cb86 38 38 #include <usb/usb.h> 39 39 #include <driver.h> 40 #include <usb/classes/hidparser.h> 40 41 41 42 /** USB/HID device requests. */ … … 66 67 usb_address_t address; 67 68 usb_endpoint_t default_ep; 69 usb_hid_report_parser_t *parser; 68 70 } usb_hid_dev_kbd_t; 69 71 -
uspace/lib/usb/include/usb/devreq.h
r101ef25c r243cb86 38 38 #include <ipc/ipc.h> 39 39 #include <async.h> 40 #include <usb/usb.h> 41 #include <usb/descriptor.h> 40 42 41 43 /** Standard device request. */ … … 83 85 } __attribute__ ((packed)) usb_device_request_setup_packet_t; 84 86 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 85 96 #endif 86 97 /** -
uspace/lib/usb/include/usb/hcdhubd.h
r101ef25c r243cb86 116 116 } usb_hcd_transfer_ops_t; 117 117 118 /** 119 * @brief structure holding information about free and used addresses 120 * 121 * This structure should not be used outside usb hcd driver. 122 * You better consider it to be 'private'. 123 */ 124 typedef struct { 125 /** lower bound included in the interval */ 126 usb_address_t lower_bound; 127 128 /** upper bound, excluded from the interval */ 129 usb_address_t upper_bound; 130 131 /** */ 132 link_t link; 133 }usb_address_list_t; 134 118 135 struct usb_hc_device { 119 136 /** Transfer operations. */ … … 131 148 /** List of hubs operating from this HC. */ 132 149 link_t hubs; 150 151 /** Structure with free and used addresses */ 152 link_t addresses; 133 153 134 154 /** Link to other driven HCs. */ … … 146 166 147 167 int usb_hcd_main(usb_hc_driver_t *); 148 int usb_hcd_add_root_hub(usb_hc_device_t *dev); 168 int usb_hcd_add_root_hub(device_t *dev); 169 170 /** 171 * find first not yet used address on this host controller and use it 172 * @param this_hcd 173 * @return number in the range of allowed usb addresses or 174 * a negative number if not succesful 175 */ 176 usb_address_t usb_use_free_address(usb_hc_device_t * this_hcd); 177 178 /** 179 * @brief free the address in the address space of this hcd. 180 * 181 * if address is not used, nothing happens 182 * @param this_hcd 183 * @param addr 184 */ 185 void usb_free_used_address(usb_hc_device_t * this_hcd, usb_address_t addr ); 149 186 150 187 … … 154 191 */ 155 192 193 device_t *usb_hc_connect(device_t *); 156 194 157 195 int usb_hc_async_interrupt_out(usb_hc_device_t *, usb_target_t, -
uspace/lib/usb/include/usb/usb.h
r101ef25c r243cb86 69 69 typedef int usb_address_t; 70 70 71 /** Default USB address. */ 72 #define USB_ADDRESS_DEFAULT 0 73 /** Maximum address number in USB 1.1. */ 74 #define USB11_ADDRESS_MAX 128 75 71 76 /** USB endpoint number type. 72 77 * Negative values could be used to indicate error. -
uspace/lib/usb/include/usb/usbdrv.h
r101ef25c r243cb86 36 36 #define LIBUSB_USBDRV_H_ 37 37 38 #include "usb.h"38 #include <usb/usb.h> 39 39 #include <driver.h> 40 #include <usb/devreq.h> 41 #include <usb/descriptor.h> 40 42 41 43 int usb_drv_hc_connect(device_t *, unsigned int); 44 45 int usb_drv_reserve_default_address(int); 46 int usb_drv_release_default_address(int); 47 usb_address_t usb_drv_request_address(int); 48 int usb_drv_bind_address(int, usb_address_t, devman_handle_t); 49 int usb_drv_release_address(int, usb_address_t); 42 50 43 51 usb_address_t usb_drv_get_my_address(int, device_t *); … … 48 56 void *, size_t, size_t *, usb_handle_t *); 49 57 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 50 63 int usb_drv_async_control_write_setup(int, usb_target_t, 51 64 void *, size_t, usb_handle_t *); … … 54 67 int usb_drv_async_control_write_status(int, usb_target_t, 55 68 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 56 77 57 78 int usb_drv_async_control_read_setup(int, usb_target_t, … … 62 83 usb_handle_t *); 63 84 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 64 94 int usb_drv_async_wait_for(usb_handle_t); 95 65 96 66 97 #endif -
uspace/lib/usb/src/hcdhubd.c
r101ef25c r243cb86 51 51 */ 52 52 static int add_device(device_t *dev) { 53 bool is_hc = str_cmp(dev->name, USB_HUB_DEVICE_NAME) != 0; 54 printf("%s: add_device(name=\"%s\")\n", hc_driver->name, dev->name); 55 56 if (is_hc) { 57 /* 58 * We are the HC itself. 59 */ 60 return usb_add_hc_device(dev); 61 } else { 62 /* 63 * We are some (maybe deeply nested) hub. 64 * Thus, assign our own operations and explore already 65 * connected devices. 66 */ 67 return usb_add_hub_device(dev); 68 } 53 return ENOTSUP; 69 54 } 70 55 … … 105 90 * @return Error code. 106 91 */ 107 int usb_hcd_add_root_hub( usb_hc_device_t *dev)92 int usb_hcd_add_root_hub(device_t *dev) 108 93 { 109 94 char *id; 110 int rc = asprintf(&id, "usb&h c=%s&hub", hc_driver->name);95 int rc = asprintf(&id, "usb&hub"); 111 96 if (rc <= 0) { 112 97 return rc; 113 98 } 114 99 115 rc = usb_hc_add_child_device(dev ->generic, USB_HUB_DEVICE_NAME, id, true);100 rc = usb_hc_add_child_device(dev, USB_HUB_DEVICE_NAME, id, true); 116 101 if (rc != EOK) { 117 102 free(id); … … 129 114 130 115 /** Adds a child device fibril worker. */ 131 static int fibril_add_child_device(void *arg) 132 { 116 static int fibril_add_child_device(void *arg) { 133 117 struct child_device_info *child_info 134 118 = (struct child_device_info *) arg; 135 119 int rc; 136 120 … … 156 140 157 141 printf("%s: adding child device `%s' with match \"%s\"\n", 158 142 hc_driver->name, child->name, match_id->id); 159 143 rc = child_device_register(child, child_info->parent); 160 144 printf("%s: child device `%s' registration: %s\n", 161 145 hc_driver->name, child->name, str_error(rc)); 162 146 163 147 if (rc != EOK) { … … 197 181 */ 198 182 int usb_hc_add_child_device(device_t *parent, const char *name, 199 const char *match_id, bool create_fibril) 200 { 183 const char *match_id, bool create_fibril) { 201 184 printf("%s: about to add child device `%s' (%s)\n", hc_driver->name, 202 185 name, match_id); 203 186 204 187 /* … … 209 192 210 193 struct child_device_info *child_info 211 = malloc(sizeof(struct child_device_info));194 = malloc(sizeof (struct child_device_info)); 212 195 213 196 child_info->parent = parent; … … 233 216 * @return USB device address or error code. 234 217 */ 235 usb_address_t usb_get_address_by_handle(devman_handle_t handle) 236 { 218 usb_address_t usb_get_address_by_handle(devman_handle_t handle) { 237 219 /* TODO: search list of attached devices. */ 238 220 return ENOENT; 239 221 } 240 222 223 usb_address_t usb_use_free_address(usb_hc_device_t * this_hcd) { 224 //is there free address? 225 link_t * addresses = &this_hcd->addresses; 226 if (list_empty(addresses)) return -1; 227 link_t * link_addr = addresses; 228 bool found = false; 229 usb_address_list_t * range = NULL; 230 while (!found) { 231 link_addr = link_addr->next; 232 if (link_addr == addresses) return -2; 233 range = list_get_instance(link_addr, 234 usb_address_list_t, link); 235 if (range->upper_bound - range->lower_bound > 0) { 236 found = true; 237 } 238 } 239 //now we have interval 240 int result = range->lower_bound; 241 ++(range->lower_bound); 242 if (range->upper_bound - range->lower_bound == 0) { 243 list_remove(&range->link); 244 free(range); 245 } 246 return result; 247 } 248 249 void usb_free_used_address(usb_hc_device_t * this_hcd, usb_address_t addr) { 250 //check range 251 if (addr < usb_lowest_address || addr > usb_highest_address) 252 return; 253 link_t * addresses = &this_hcd->addresses; 254 link_t * link_addr = addresses; 255 //find 'good' interval 256 usb_address_list_t * found_range = NULL; 257 bool found = false; 258 while (!found) { 259 link_addr = link_addr->next; 260 if (link_addr == addresses) { 261 found = true; 262 } else { 263 usb_address_list_t * range = list_get_instance(link_addr, 264 usb_address_list_t, link); 265 if ( (range->lower_bound - 1 == addr) || 266 (range->upper_bound == addr)) { 267 found = true; 268 found_range = range; 269 } 270 if (range->lower_bound - 1 > addr) { 271 found = true; 272 } 273 274 } 275 } 276 if (found_range == NULL) { 277 //no suitable range found 278 usb_address_list_t * result_range = 279 (usb_address_list_t*) malloc(sizeof (usb_address_list_t)); 280 result_range->lower_bound = addr; 281 result_range->upper_bound = addr + 1; 282 list_insert_before(&result_range->link, link_addr); 283 } else { 284 //we have good range 285 if (found_range->lower_bound - 1 == addr) { 286 --found_range->lower_bound; 287 } else { 288 //only one possible case 289 ++found_range->upper_bound; 290 if (found_range->link.next != addresses) { 291 usb_address_list_t * next_range = 292 list_get_instance( &found_range->link.next, 293 usb_address_list_t, link); 294 //check neighbour range 295 if (next_range->lower_bound == addr + 1) { 296 //join ranges 297 found_range->upper_bound = next_range->upper_bound; 298 list_remove(&next_range->link); 299 free(next_range); 300 } 301 } 302 } 303 } 304 305 } 306 241 307 /** 242 308 * @} -
uspace/lib/usb/src/hcdhubd_private.h
r101ef25c r243cb86 46 46 usb_address_t usb_get_address_by_handle(devman_handle_t); 47 47 int usb_add_hc_device(device_t *); 48 int usb_add_hub_device(device_t *); 48 49 /** lowest allowed usb address */ 50 extern int usb_lowest_address; 51 52 /** highest allowed usb address */ 53 extern int usb_highest_address; 54 55 /** 56 * @brief initialize address list of given hcd 57 * 58 * This function should be used only for hcd initialization. 59 * It creates interval list of free addresses, thus it is initialized as 60 * list with one interval with whole address space. Using an address shrinks 61 * the interval, freeing an address extends an interval or creates a 62 * new one. 63 * 64 * @param hcd 65 * @return 66 */ 67 void usb_create_address_list(usb_hc_device_t * hcd); 68 69 70 71 72 49 73 50 74 #endif -
uspace/lib/usb/src/hcdrv.c
r101ef25c r243cb86 47 47 LIST_INITIALIZE(hc_list); 48 48 49 /* Fake driver to have the name item initialized. */ 50 static usb_hc_driver_t hc_driver_fake = { 51 .name = "HCD", 52 }; 53 49 54 /** Our HC driver. */ 50 usb_hc_driver_t *hc_driver = NULL; 55 usb_hc_driver_t *hc_driver = &hc_driver_fake; 56 57 int usb_lowest_address = 1; 58 59 int usb_highest_address = 255; 51 60 52 61 static device_ops_t usb_device_ops = { 53 62 .interfaces[USBHC_DEV_IFACE] = &usbhc_interface 54 63 }; 64 65 66 void usb_create_address_list(usb_hc_device_t * hcd){ 67 list_initialize(&hcd->addresses); 68 usb_address_list_t * range = 69 (usb_address_list_t*)malloc(sizeof(usb_address_list_t)); 70 range->lower_bound = usb_lowest_address; 71 range->upper_bound = usb_highest_address + 1; 72 list_append(&range->link, &hcd->addresses); 73 } 55 74 56 75 static usb_hc_device_t *usb_hc_device_create(device_t *dev) { … … 59 78 list_initialize(&hc_dev->link); 60 79 list_initialize(&hc_dev->hubs); 80 usb_create_address_list(hc_dev); 61 81 list_initialize(&hc_dev->attached_devices); 62 82 hc_dev->transfer_ops = NULL; … … 71 91 int usb_add_hc_device(device_t *dev) 72 92 { 93 return ENOTSUP; 73 94 usb_hc_device_t *hc_dev = usb_hc_device_create(dev); 74 95 -
uspace/lib/usb/src/localdrv.c
r101ef25c r243cb86 39 39 #include <errno.h> 40 40 41 /** Find host controller when handled by current task. 42 * 43 * @param dev Device asking for connection. 44 * @return Device structure corresponding to parent host controller. 45 * @retval NULL Corresponding host controller not found. 46 */ 47 device_t *usb_hc_connect(device_t *dev) 48 { 49 /* 50 * FIXME: this will not work when some hub on the path is 51 * not driven by the same task. 52 */ 53 device_t *parent = dev; 54 while (parent->parent != NULL) { 55 parent = parent->parent; 56 } 57 58 if (dev == parent) { 59 printf("FIXME in %s:%d encountered!\n", __FILE__, __LINE__); 60 parent = NULL; 61 } 62 63 return parent; 64 } 65 41 66 /** Information about pending transaction on HC. */ 42 67 typedef struct { -
uspace/lib/usb/src/remotedrv.c
r101ef25c r243cb86 300 300 */ 301 301 static void remote_in_callback(usb_hc_device_t *hc, 302 usb_transaction_outcome_t outcome, size_t actual_size, void *arg)302 size_t actual_size, usb_transaction_outcome_t outcome, void *arg) 303 303 { 304 304 transfer_info_t *transfer = (transfer_info_t *) arg; -
uspace/lib/usb/src/usbdrv.c
r101ef25c r243cb86 55 55 /** Connect to host controller the device is physically attached to. 56 56 * 57 * @param handle Device handle.57 * @param dev Device asking for connection. 58 58 * @param flags Connection flags (blocking connection). 59 59 * @return Phone to corresponding HC or error code. … … 71 71 devman_handle_t handle; 72 72 73 rc = devman_device_get_handle("/v hc", &handle, 0);73 rc = devman_device_get_handle("/virt/usbhc", &handle, 0); 74 74 if (rc != EOK) { 75 75 return rc; … … 98 98 99 99 return (usb_address_t) address; 100 } 101 102 /** Tell HC to reserve default address. 103 * 104 * @param phone Open phone to host controller driver. 105 * @return Error code. 106 */ 107 int usb_drv_reserve_default_address(int phone) 108 { 109 return async_req_0_0(phone, IPC_M_USBHC_RESERVE_DEFAULT_ADDRESS); 110 } 111 112 /** Tell HC to release default address. 113 * 114 * @param phone Open phone to host controller driver. 115 * @return Error code. 116 */ 117 int usb_drv_release_default_address(int phone) 118 { 119 return async_req_0_0(phone, IPC_M_USBHC_RELEASE_DEFAULT_ADDRESS); 120 } 121 122 /** Ask HC for free address assignment. 123 * 124 * @param phone Open phone to host controller driver. 125 * @return Assigned USB address or negative error code. 126 */ 127 usb_address_t usb_drv_request_address(int phone) 128 { 129 ipcarg_t address; 130 int rc = async_req_0_1(phone, IPC_M_USBHC_REQUEST_ADDRESS, &address); 131 if (rc != EOK) { 132 return rc; 133 } else { 134 return (usb_address_t) address; 135 } 136 } 137 138 /** Inform HC about binding address with devman handle. 139 * 140 * @param phone Open phone to host controller driver. 141 * @param address Address to be binded. 142 * @param handle Devman handle of the device. 143 * @return Error code. 144 */ 145 int usb_drv_bind_address(int phone, usb_address_t address, 146 devman_handle_t handle) 147 { 148 int rc = async_req_2_0(phone, IPC_M_USBHC_BIND_ADDRESS, 149 address, handle); 150 151 return rc; 152 } 153 154 /** Inform HC about address release. 155 * 156 * @param phone Open phone to host controller driver. 157 * @param address Address to be released. 158 * @return Error code. 159 */ 160 int usb_drv_release_address(int phone, usb_address_t address) 161 { 162 return async_req_1_0(phone, IPC_M_USBHC_RELEASE_ADDRESS, address); 100 163 } 101 164 -
uspace/lib/usbvirt/main.c
r101ef25c r243cb86 183 183 } 184 184 185 /** Create necessary phones for com unication with virtual HCD.185 /** Create necessary phones for communication with virtual HCD. 186 186 * This function wraps following calls: 187 * -# open <code>/dev/devices/\\v hc for reading187 * -# open <code>/dev/devices/\\virt\\usbhc 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 occured. 196 * 197 * @param hcd_path HCD identification under devfs 198 * (without <code>/dev/usb/</code>). 195 * error occurred. 196 * 199 197 * @param dev Device to connect. 200 198 * @return EOK on success or error code from errno.h. … … 207 205 } 208 206 209 const char *vhc_path = "/v hc";207 const char *vhc_path = "/virt/usbhc"; 210 208 int rc; 211 209 devman_handle_t handle; -
uspace/srv/bd/file_bd/file_bd.c
r101ef25c r243cb86 56 56 #define NAME "file_bd" 57 57 58 static const size_t block_size = 512; 58 #define DEFAULT_BLOCK_SIZE 512 59 60 static size_t block_size; 59 61 static aoff64_t num_blocks; 60 62 static FILE *img; … … 63 65 static fibril_mutex_t dev_lock; 64 66 67 static void print_usage(void); 65 68 static int file_bd_init(const char *fname); 66 69 static void file_bd_connection(ipc_callid_t iid, ipc_call_t *icall); … … 71 74 { 72 75 int rc; 76 char *image_name; 77 char *device_name; 73 78 74 79 printf(NAME ": File-backed block device driver\n"); 75 80 76 if (argc != 3) { 77 printf("Expected two arguments (image name, device name).\n"); 81 block_size = DEFAULT_BLOCK_SIZE; 82 83 ++argv; --argc; 84 while (*argv != NULL && (*argv)[0] == '-') { 85 /* Option */ 86 if (str_cmp(*argv, "-b") == 0) { 87 if (argc < 2) { 88 printf("Argument missing.\n"); 89 print_usage(); 90 return -1; 91 } 92 93 rc = str_size_t(argv[1], NULL, 10, true, &block_size); 94 if (rc != EOK || block_size == 0) { 95 printf("Invalid block size '%s'.\n", argv[1]); 96 print_usage(); 97 return -1; 98 } 99 ++argv; --argc; 100 } else { 101 printf("Invalid option '%s'.\n", *argv); 102 print_usage(); 103 return -1; 104 } 105 ++argv; --argc; 106 } 107 108 if (argc < 2) { 109 printf("Missing arguments.\n"); 110 print_usage(); 78 111 return -1; 79 112 } 80 113 81 if (file_bd_init(argv[1]) != EOK) 114 image_name = argv[0]; 115 device_name = argv[1]; 116 117 if (file_bd_init(image_name) != EOK) 82 118 return -1; 83 119 84 rc = devmap_device_register( argv[2], &devmap_handle);120 rc = devmap_device_register(device_name, &devmap_handle); 85 121 if (rc != EOK) { 86 122 devmap_hangup_phone(DEVMAP_DRIVER); 87 printf(NAME ": Unable to register device %s.\n",88 argv[2]);123 printf(NAME ": Unable to register device '%s'.\n", 124 device_name); 89 125 return rc; 90 126 } … … 96 132 /* Not reached */ 97 133 return 0; 134 } 135 136 static void print_usage(void) 137 { 138 printf("Usage: " NAME " [-b <block_size>] <image_file> <device_name>\n"); 98 139 } 99 140 -
uspace/srv/devman/devman.c
r101ef25c r243cb86 516 516 /** Notify driver about the devices to which it was assigned. 517 517 * 518 * The driver's mutex must be locked.519 *520 518 * @param driver The driver to which the devices are passed. 521 519 */ … … 526 524 int phone; 527 525 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 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) { 545 link = link->next; 546 continue; 547 } 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 */ 533 579 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); 537 link = link->next; 538 } 539 540 ipc_hangup(phone); 541 } 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); 542 597 } 543 598 … … 553 608 void initialize_running_driver(driver_t *driver, dev_tree_t *tree) 554 609 { 555 printf(NAME ": initialize_running_driver\n"); 556 fibril_mutex_lock(&driver->driver_mutex); 610 printf(NAME ": initialize_running_driver (`%s')\n", driver->name); 557 611 558 612 /* … … 561 615 */ 562 616 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);568 617 } 569 618 … … 637 686 } 638 687 688 static FIBRIL_MUTEX_INITIALIZE(add_device_guard); 639 689 640 690 /** Pass a device to running driver. … … 645 695 void add_device(int phone, driver_t *drv, node_t *node, dev_tree_t *tree) 646 696 { 647 printf(NAME ": add_device\n"); 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); 648 705 649 706 ipcarg_t rc; … … 657 714 parent_handle = 0; 658 715 } 716 659 717 aid_t req = async_send_2(phone, DRIVER_ADD_DEVICE, node->handle, 660 718 parent_handle, &answer); … … 666 724 /* TODO handle error */ 667 725 } 668 726 669 727 /* Wait for answer from the driver. */ 670 728 async_wait_for(req, &rc); 729 730 fibril_mutex_unlock(&add_device_guard); 731 671 732 switch(rc) { 672 733 case EOK: … … 681 742 } 682 743 744 node->passed_to_driver = true; 745 683 746 return; 684 747 } … … 706 769 attach_driver(node, drv); 707 770 771 fibril_mutex_lock(&drv->driver_mutex); 708 772 if (drv->state == DRIVER_NOT_STARTED) { 709 773 /* Start the driver. */ 710 774 start_driver(drv); 711 775 } 712 713 if (drv->state == DRIVER_RUNNING) { 776 bool is_running = drv->state == DRIVER_RUNNING; 777 fibril_mutex_unlock(&drv->driver_mutex); 778 779 if (is_running) { 714 780 /* Notify the driver about the new device. */ 715 int phone = ipc_connect_me_to(drv->phone, DRIVER_DEVMAN, 0, 0);781 int phone = async_connect_me_to(drv->phone, DRIVER_DEVMAN, 0, 0); 716 782 if (phone > 0) { 717 783 add_device(phone, drv, node, tree); … … 875 941 node->name = dev_name; 876 942 if (!set_dev_path(node, parent)) { 877 fibril_rwlock_write_unlock(&tree->rwlock);878 943 return false; 879 944 } … … 1097 1162 while (link != &class_list->classes) { 1098 1163 cl = list_get_instance(link, dev_class_t, link); 1099 if (str_cmp(cl->name, class_name) == 0) 1164 if (str_cmp(cl->name, class_name) == 0) { 1100 1165 return cl; 1166 } 1167 link = link->next; 1101 1168 } 1102 1169 -
uspace/srv/devman/devman.h
r101ef25c r243cb86 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; 170 175 }; 171 176 -
uspace/srv/devman/main.c
r101ef25c r243cb86 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 199 206 /** Handle child device registration. 200 207 * … … 237 244 238 245 devman_receive_match_ids(match_count, &node->match_ids); 239 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 240 265 /* Return device handle to parent's driver. */ 241 266 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);245 267 } 246 268 … … 297 319 printf(NAME ": device '%s' added to class '%s', class name '%s' was " 298 320 "asigned to it\n", dev->pathname, class_name, class_info->dev_name); 299 321 300 322 ipc_answer_0(callid, EOK); 301 323 } -
uspace/srv/devman/match.c
r101ef25c r243cb86 46 46 if (str_cmp(driver->id, device->id) == 0) { 47 47 /* 48 * The strings match es, return their score multiplied.48 * The strings match, return the product of their scores. 49 49 */ 50 50 return driver->score * device->score; … … 66 66 67 67 /* 68 * Go through all pairs, return the highest score obtaine td.68 * Go through all pairs, return the highest score obtained. 69 69 */ 70 70 int highest_score = 0; -
uspace/srv/fs/devfs/devfs.c
r101ef25c r243cb86 53 53 static vfs_info_t devfs_vfs_info = { 54 54 .name = NAME, 55 .concurrent_read_write = false, 56 .write_retains_size = false, 55 57 }; 56 58 -
uspace/srv/fs/fat/fat.c
r101ef25c r243cb86 52 52 vfs_info_t fat_vfs_info = { 53 53 .name = NAME, 54 .concurrent_read_write = false, 55 .write_retains_size = false, 54 56 }; 55 57 -
uspace/srv/fs/tmpfs/tmpfs.c
r101ef25c r243cb86 57 57 vfs_info_t tmpfs_vfs_info = { 58 58 .name = NAME, 59 .concurrent_read_write = false, 60 .write_retains_size = false, 59 61 }; 60 62 -
uspace/srv/net/il/arp/arp.c
r101ef25c r243cb86 72 72 #define NAME "arp" 73 73 74 /** Number of microseconds to wait for an ARP reply. */ 75 #define ARP_TRANS_WAIT 1000000 76 74 77 /** ARP global data. */ 75 78 arp_globals_t arp_globals; … … 77 80 DEVICE_MAP_IMPLEMENT(arp_cache, arp_device_t); 78 81 INT_MAP_IMPLEMENT(arp_protos, arp_proto_t); 79 GENERIC_CHAR_MAP_IMPLEMENT(arp_addr, measured_string_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 80 105 81 106 /** Clears the device specific data. … … 96 121 if (proto->addr_data) 97 122 free(proto->addr_data); 123 arp_clear_addr(&proto->addresses); 98 124 arp_addr_destroy(&proto->addresses); 99 125 } … … 107 133 arp_device_t *device; 108 134 109 fibril_ rwlock_write_lock(&arp_globals.lock);135 fibril_mutex_lock(&arp_globals.lock); 110 136 for (count = arp_cache_count(&arp_globals.cache) - 1; count >= 0; 111 137 count--) { … … 120 146 } 121 147 arp_cache_clear(&arp_globals.cache); 122 fibril_ rwlock_write_unlock(&arp_globals.lock);148 fibril_mutex_unlock(&arp_globals.lock); 123 149 printf("Cache cleaned\n"); 124 150 return EOK; … … 130 156 arp_device_t *device; 131 157 arp_proto_t *proto; 132 133 fibril_rwlock_write_lock(&arp_globals.lock); 158 arp_trans_t *trans; 159 160 fibril_mutex_lock(&arp_globals.lock); 134 161 device = arp_cache_find(&arp_globals.cache, device_id); 135 162 if (!device) { 136 fibril_ rwlock_write_unlock(&arp_globals.lock);163 fibril_mutex_unlock(&arp_globals.lock); 137 164 return ENOENT; 138 165 } 139 166 proto = arp_protos_find(&device->protos, protocol); 140 167 if (!proto) { 141 fibril_ rwlock_write_unlock(&arp_globals.lock);168 fibril_mutex_unlock(&arp_globals.lock); 142 169 return ENOENT; 143 170 } 171 trans = arp_addr_find(&proto->addresses, address->value, address->length); 172 if (trans) 173 arp_clear_trans(trans); 144 174 arp_addr_exclude(&proto->addresses, address->value, address->length); 145 fibril_ rwlock_write_unlock(&arp_globals.lock);175 fibril_mutex_unlock(&arp_globals.lock); 146 176 return EOK; 147 177 } … … 152 182 arp_device_t *device; 153 183 154 fibril_ rwlock_write_lock(&arp_globals.lock);184 fibril_mutex_lock(&arp_globals.lock); 155 185 device = arp_cache_find(&arp_globals.cache, device_id); 156 186 if (!device) { 157 fibril_ rwlock_write_unlock(&arp_globals.lock);187 fibril_mutex_unlock(&arp_globals.lock); 158 188 return ENOENT; 159 189 } 160 190 arp_clear_device(device); 161 191 printf("Device %d cleared\n", device_id); 162 fibril_ rwlock_write_unlock(&arp_globals.lock);192 fibril_mutex_unlock(&arp_globals.lock); 163 193 return EOK; 164 194 } … … 221 251 int rc; 222 252 223 fibril_ rwlock_write_lock(&arp_globals.lock);253 fibril_mutex_lock(&arp_globals.lock); 224 254 225 255 /* An existing device? */ … … 229 259 if (device->service != service) { 230 260 printf("Device %d already exists\n", device->device_id); 231 fibril_ rwlock_write_unlock(&arp_globals.lock);261 fibril_mutex_unlock(&arp_globals.lock); 232 262 return EEXIST; 233 263 } … … 241 271 rc = arp_proto_create(&proto, protocol, address); 242 272 if (rc != EOK) { 243 fibril_ rwlock_write_unlock(&arp_globals.lock);273 fibril_mutex_unlock(&arp_globals.lock); 244 274 return rc; 245 275 } … … 247 277 proto); 248 278 if (index < 0) { 249 fibril_ rwlock_write_unlock(&arp_globals.lock);279 fibril_mutex_unlock(&arp_globals.lock); 250 280 free(proto); 251 281 return index; … … 262 292 device = (arp_device_t *) malloc(sizeof(arp_device_t)); 263 293 if (!device) { 264 fibril_ rwlock_write_unlock(&arp_globals.lock);294 fibril_mutex_unlock(&arp_globals.lock); 265 295 return ENOMEM; 266 296 } … … 269 299 rc = arp_protos_initialize(&device->protos); 270 300 if (rc != EOK) { 271 fibril_ rwlock_write_unlock(&arp_globals.lock);301 fibril_mutex_unlock(&arp_globals.lock); 272 302 free(device); 273 303 return rc; … … 275 305 rc = arp_proto_create(&proto, protocol, address); 276 306 if (rc != EOK) { 277 fibril_ rwlock_write_unlock(&arp_globals.lock);307 fibril_mutex_unlock(&arp_globals.lock); 278 308 free(device); 279 309 return rc; … … 281 311 index = arp_protos_add(&device->protos, proto->service, proto); 282 312 if (index < 0) { 283 fibril_ rwlock_write_unlock(&arp_globals.lock);313 fibril_mutex_unlock(&arp_globals.lock); 284 314 arp_protos_destroy(&device->protos); 285 315 free(device); … … 293 323 arp_globals.client_connection); 294 324 if (device->phone < 0) { 295 fibril_ rwlock_write_unlock(&arp_globals.lock);325 fibril_mutex_unlock(&arp_globals.lock); 296 326 arp_protos_destroy(&device->protos); 297 327 free(device); … … 303 333 &device->packet_dimension); 304 334 if (rc != EOK) { 305 fibril_ rwlock_write_unlock(&arp_globals.lock);335 fibril_mutex_unlock(&arp_globals.lock); 306 336 arp_protos_destroy(&device->protos); 307 337 free(device); … … 313 343 &device->addr_data); 314 344 if (rc != EOK) { 315 fibril_ rwlock_write_unlock(&arp_globals.lock);345 fibril_mutex_unlock(&arp_globals.lock); 316 346 arp_protos_destroy(&device->protos); 317 347 free(device); … … 323 353 &device->broadcast_addr, &device->broadcast_data); 324 354 if (rc != EOK) { 325 fibril_ rwlock_write_unlock(&arp_globals.lock);355 fibril_mutex_unlock(&arp_globals.lock); 326 356 free(device->addr); 327 357 free(device->addr_data); … … 334 364 device); 335 365 if (rc != EOK) { 336 fibril_ rwlock_write_unlock(&arp_globals.lock);366 fibril_mutex_unlock(&arp_globals.lock); 337 367 free(device->addr); 338 368 free(device->addr_data); … … 347 377 device->service, protocol); 348 378 } 349 fibril_ rwlock_write_unlock(&arp_globals.lock);379 fibril_mutex_unlock(&arp_globals.lock); 350 380 351 381 return EOK; … … 363 393 int rc; 364 394 365 fibril_ rwlock_initialize(&arp_globals.lock);366 fibril_ rwlock_write_lock(&arp_globals.lock);395 fibril_mutex_initialize(&arp_globals.lock); 396 fibril_mutex_lock(&arp_globals.lock); 367 397 arp_globals.client_connection = client_connection; 368 398 rc = arp_cache_initialize(&arp_globals.cache); 369 fibril_ rwlock_write_unlock(&arp_globals.lock);399 fibril_mutex_unlock(&arp_globals.lock); 370 400 371 401 return rc; … … 383 413 arp_device_t *device; 384 414 385 fibril_ rwlock_write_lock(&arp_globals.lock);415 fibril_mutex_lock(&arp_globals.lock); 386 416 device = arp_cache_find(&arp_globals.cache, device_id); 387 417 if (!device) { 388 fibril_ rwlock_write_unlock(&arp_globals.lock);418 fibril_mutex_unlock(&arp_globals.lock); 389 419 return ENOENT; 390 420 } 391 421 device->packet_dimension.content = mtu; 392 fibril_ rwlock_write_unlock(&arp_globals.lock);422 fibril_mutex_unlock(&arp_globals.lock); 393 423 printf("arp - device %d changed mtu to %zu\n\n", device_id, mtu); 394 424 return EOK; … … 421 451 arp_device_t *device; 422 452 arp_proto_t *proto; 423 measured_string_t *hw_source;453 arp_trans_t *trans; 424 454 uint8_t *src_hw; 425 455 uint8_t *src_proto; … … 452 482 des_hw = src_proto + header->protocol_length; 453 483 des_proto = des_hw + header->hardware_length; 454 hw_source= arp_addr_find(&proto->addresses, (char *) src_proto,484 trans = arp_addr_find(&proto->addresses, (char *) src_proto, 455 485 CONVERT_SIZE(uint8_t, char, header->protocol_length)); 456 486 /* Exists? */ 457 if ( hw_source) {458 if ( hw_source->length != CONVERT_SIZE(uint8_t, char,487 if (trans && trans->hw_addr) { 488 if (trans->hw_addr->length != CONVERT_SIZE(uint8_t, char, 459 489 header->hardware_length)) { 460 490 return EINVAL; 461 491 } 462 memcpy( hw_source->value, src_hw, hw_source->length);492 memcpy(trans->hw_addr->value, src_hw, trans->hw_addr->length); 463 493 } 464 494 /* Is my protocol address? */ … … 470 500 proto->addr->length)) { 471 501 /* Not already updated? */ 472 if (!hw_source) { 473 hw_source = measured_string_create_bulk((char *) src_hw, 474 CONVERT_SIZE(uint8_t, char, 502 if (!trans) { 503 trans = (arp_trans_t *) malloc(sizeof(arp_trans_t)); 504 if (!trans) 505 return ENOMEM; 506 trans->hw_addr = NULL; 507 fibril_condvar_initialize(&trans->cv); 508 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! */ 513 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, 475 519 header->hardware_length)); 476 if (! hw_source)520 if (!trans->hw_addr) 477 521 return ENOMEM; 478 522 479 rc = arp_addr_add(&proto->addresses, (char *) src_proto, 480 CONVERT_SIZE(uint8_t, char, 481 header->protocol_length), hw_source); 482 if (rc != EOK) 483 return rc; 523 /* Notify the fibrils that wait for the translation. */ 524 fibril_condvar_broadcast(&trans->cv); 484 525 } 485 526 if (ntohs(header->operation) == ARPOP_REQUEST) { … … 490 531 memcpy(src_hw, device->addr->value, 491 532 device->packet_dimension.addr_len); 492 memcpy(des_hw, hw_source->value,533 memcpy(des_hw, trans->hw_addr->value, 493 534 header->hardware_length); 494 535 … … 516 557 * @param[in] protocol The protocol service. 517 558 * @param[in] target The target protocol address. 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 * 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 526 565 arp_translate_message(device_id_t device_id, services_t protocol, 527 measured_string_t *target )566 measured_string_t *target, measured_string_t **translation) 528 567 { 529 568 arp_device_t *device; 530 569 arp_proto_t *proto; 531 measured_string_t *addr;570 arp_trans_t *trans; 532 571 size_t length; 533 572 packet_t *packet; 534 573 arp_header_t *header; 535 536 if (!target) 537 return NULL; 574 bool retry = false; 575 int rc; 576 577 restart: 578 if (!target || !translation) 579 return EBADMEM; 538 580 539 581 device = arp_cache_find(&arp_globals.cache, device_id); 540 582 if (!device) 541 return NULL;583 return ENOENT; 542 584 543 585 proto = arp_protos_find(&device->protos, protocol); 544 586 if (!proto || (proto->addr->length != target->length)) 545 return NULL; 546 547 addr = arp_addr_find(&proto->addresses, target->value, target->length); 548 if (addr) 549 return addr; 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; 550 606 551 607 /* ARP packet content size = header + (address + translation) * 2 */ … … 553 609 CONVERT_SIZE(char, uint8_t, device->addr->length)); 554 610 if (length > device->packet_dimension.content) 555 return NULL;611 return ELIMIT; 556 612 557 613 packet = packet_get_4_remote(arp_globals.net_phone, … … 559 615 length, device->packet_dimension.suffix); 560 616 if (!packet) 561 return NULL;617 return ENOMEM; 562 618 563 619 header = (arp_header_t *) packet_suffix(packet, length); 564 620 if (!header) { 565 621 pq_release_remote(arp_globals.net_phone, packet_get_id(packet)); 566 return NULL;622 return ENOMEM; 567 623 } 568 624 … … 583 639 memcpy(((uint8_t *) header) + length, target->value, target->length); 584 640 585 if (packet_set_addr(packet, (uint8_t *) device->addr->value,641 rc = packet_set_addr(packet, (uint8_t *) device->addr->value, 586 642 (uint8_t *) device->broadcast_addr->value, 587 CONVERT_SIZE(char, uint8_t, device->addr->length)) != EOK) { 643 CONVERT_SIZE(char, uint8_t, device->addr->length)); 644 if (rc != EOK) { 588 645 pq_release_remote(arp_globals.net_phone, packet_get_id(packet)); 589 return NULL;646 return rc; 590 647 } 591 648 592 649 nil_send_msg(device->phone, device_id, packet, SERVICE_ARP); 593 return NULL; 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; 594 669 } 595 670 … … 642 717 return rc; 643 718 644 fibril_ rwlock_read_lock(&arp_globals.lock);645 translation= arp_translate_message(IPC_GET_DEVICE(call),646 IPC_GET_SERVICE(call), address );719 fibril_mutex_lock(&arp_globals.lock); 720 rc = arp_translate_message(IPC_GET_DEVICE(call), 721 IPC_GET_SERVICE(call), address, &translation); 647 722 free(address); 648 723 free(data); 724 if (rc != EOK) { 725 fibril_mutex_unlock(&arp_globals.lock); 726 return rc; 727 } 649 728 if (!translation) { 650 fibril_ rwlock_read_unlock(&arp_globals.lock);729 fibril_mutex_unlock(&arp_globals.lock); 651 730 return ENOENT; 652 731 } 653 732 rc = measured_strings_reply(translation, 1); 654 fibril_ rwlock_read_unlock(&arp_globals.lock);733 fibril_mutex_unlock(&arp_globals.lock); 655 734 return rc; 656 735 … … 682 761 return rc; 683 762 684 fibril_ rwlock_read_lock(&arp_globals.lock);763 fibril_mutex_lock(&arp_globals.lock); 685 764 do { 686 765 next = pq_detach(packet); … … 692 771 packet = next; 693 772 } while (packet); 694 fibril_ rwlock_read_unlock(&arp_globals.lock);773 fibril_mutex_unlock(&arp_globals.lock); 695 774 696 775 return EOK; -
uspace/srv/net/il/arp/arp.h
r101ef25c r243cb86 65 65 typedef struct arp_proto arp_proto_t; 66 66 67 /** Type definition of the ARP address translation record. 68 * @see arp_trans 69 */ 70 typedef struct arp_trans arp_trans_t; 71 67 72 /** ARP address map. 68 73 * … … 70 75 * @see generic_char_map.h 71 76 */ 72 GENERIC_CHAR_MAP_DECLARE(arp_addr, measured_string_t);77 GENERIC_CHAR_MAP_DECLARE(arp_addr, arp_trans_t); 73 78 74 79 /** ARP address cache. … … 89 94 struct arp_device { 90 95 /** Actual device hardware address. */ 91 measured_string_t * 96 measured_string_t *addr; 92 97 /** Actual device hardware address data. */ 93 98 char *addr_data; 94 99 /** Broadcast device hardware address. */ 95 measured_string_t * 100 measured_string_t *broadcast_addr; 96 101 /** Broadcast device hardware address data. */ 97 102 char *broadcast_data; … … 129 134 int net_phone; 130 135 /** Safety lock. */ 131 fibril_ rwlock_t lock;136 fibril_mutex_t lock; 132 137 }; 133 138 … … 144 149 }; 145 150 151 /** ARP address translation record. */ 152 struct arp_trans { 153 /** 154 * Hardware address for the translation. NULL denotes an incomplete 155 * 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 146 162 #endif 147 163 148 164 /** @} 149 165 */ 166 -
uspace/srv/vfs/vfs.h
r101ef25c r243cb86 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); 174 175 175 176 extern int vfs_lookup_internal(char *, int, vfs_lookup_res_t *, -
uspace/srv/vfs/vfs_ops.c
r101ef25c r243cb86 781 781 static void vfs_rdwr(ipc_callid_t rid, ipc_call_t *request, bool read) 782 782 { 783 vfs_info_t *vi; 783 784 784 785 /* … … 807 808 fibril_mutex_lock(&file->lock); 808 809 810 vi = fs_handle_to_info(file->node->fs_handle); 811 assert(vi); 812 809 813 /* 810 814 * Lock the file's node so that no other client can read/write to it at 811 * the same time. 812 */ 813 if (read) 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)) 814 819 fibril_rwlock_read_lock(&file->node->contents_rwlock); 815 820 else … … 857 862 858 863 /* Unlock the VFS node. */ 859 if (read )864 if (read || (vi->concurrent_read_write && vi->write_retains_size)) 860 865 fibril_rwlock_read_unlock(&file->node->contents_rwlock); 861 866 else { -
uspace/srv/vfs/vfs_register.c
r101ef25c r243cb86 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 335 358 /** 336 359 * @}
Note:
See TracChangeset
for help on using the changeset viewer.