Changes in / [299d53e:81c508c] in mainline
- Location:
- uspace/drv
- Files:
-
- 1 added
- 2 deleted
- 21 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/pciintel/pci.c
r299d53e r81c508c 320 320 /* Get the value of the BAR. */ 321 321 val = pci_conf_read_32(fun, addr); 322 323 #define IO_MASK (~0x3)324 #define MEM_MASK (~0xf)325 322 326 323 io = (bool) (val & 1); 327 324 if (io) { 328 325 addrw64 = false; 329 mask = IO_MASK;330 326 } else { 331 mask = MEM_MASK;332 327 switch ((val >> 1) & 3) { 333 328 case 0: … … 345 340 /* Get the address mask. */ 346 341 pci_conf_write_32(fun, addr, 0xffffffff); 347 mask &= pci_conf_read_32(fun, addr);342 mask = pci_conf_read_32(fun, addr); 348 343 349 344 /* Restore the original value. */ … … 664 659 size_t pci_bar_mask_to_size(uint32_t mask) 665 660 { 666 size_t size = mask & ~(mask - 1); 667 return size; 661 return ((mask & 0xfffffff0) ^ 0xffffffff) + 1; 668 662 } 669 663 -
uspace/drv/uhci-hcd/Makefile
r299d53e r81c508c 39 39 uhci.c \ 40 40 uhci_struct/transfer_descriptor.c \ 41 utils/device_keeper.c \42 41 pci.c \ 43 42 batch.c -
uspace/drv/uhci-hcd/batch.c
r299d53e r81c508c 33 33 */ 34 34 #include <errno.h> 35 #include <str_error.h>36 35 37 36 #include <usb/debug.h> … … 54 53 batch_t * batch_get(ddf_fun_t *fun, usb_target_t target, 55 54 usb_transfer_type_t transfer_type, size_t max_packet_size, 56 usb_speed_t speed, char *buffer, size_t size,55 dev_speed_t speed, char *buffer, size_t size, 57 56 char* setup_buffer, size_t setup_size, 58 57 usbhc_iface_transfer_in_callback_t func_in, … … 140 139 { 141 140 assert(instance); 142 usb_log_debug 2("Batch(%p) checking %d packet(s)for completion.\n",141 usb_log_debug("Checking(%p) %d packet for completion.\n", 143 142 instance, instance->packets); 144 143 instance->transfered_size = 0; … … 152 151 if (i > 0) 153 152 instance->transfered_size -= instance->setup_size; 154 usb_log_debug("Batch(%p) found error TD(%d):%x.\n",155 instance, i, instance->tds[i].status);156 153 return true; 157 154 } … … 159 156 transfer_descriptor_actual_size(&instance->tds[i]); 160 157 } 158 /* This is just an ugly trick to support the old API */ 161 159 instance->transfered_size -= instance->setup_size; 162 160 return true; … … 170 168 memcpy(instance->transport_buffer, instance->buffer, instance->buffer_size); 171 169 172 const bool low_speed = instance->speed == USB_SPEED_LOW;173 170 int toggle = 0; 174 171 /* setup stage */ 175 172 transfer_descriptor_init(instance->tds, DEFAULT_ERROR_COUNT, 176 instance->setup_size, toggle, false, low_speed, 177 instance->target, USB_PID_SETUP, instance->setup_buffer, 178 &instance->tds[1]); 173 instance->setup_size, toggle, false, instance->target, 174 USB_PID_SETUP, instance->setup_buffer, &instance->tds[1]); 179 175 180 176 /* data stage */ … … 186 182 187 183 transfer_descriptor_init(&instance->tds[i], DEFAULT_ERROR_COUNT, 188 instance->max_packet_size, toggle++, false, low_speed,189 instance->target,USB_PID_OUT, data, &instance->tds[i + 1]);184 instance->max_packet_size, toggle++, false, instance->target, 185 USB_PID_OUT, data, &instance->tds[i + 1]); 190 186 } 191 187 … … 193 189 i = instance->packets - 1; 194 190 transfer_descriptor_init(&instance->tds[i], DEFAULT_ERROR_COUNT, 195 0, 1, false, low_speed,instance->target, USB_PID_IN, NULL, NULL);191 0, 1, false, instance->target, USB_PID_IN, NULL, NULL); 196 192 197 193 instance->tds[i].status |= TD_STATUS_COMPLETE_INTERRUPT_FLAG; 198 usb_log_debug("Control write last TD status: %x.\n",199 instance->tds[i].status);200 194 201 195 instance->next_step = batch_call_out_and_dispose; … … 207 201 assert(instance); 208 202 209 const bool low_speed = instance->speed == USB_SPEED_LOW;210 203 int toggle = 0; 211 204 /* setup stage */ 212 205 transfer_descriptor_init(instance->tds, DEFAULT_ERROR_COUNT, 213 instance->setup_size, toggle, false, low_speed,instance->target,206 instance->setup_size, toggle, false, instance->target, 214 207 USB_PID_SETUP, instance->setup_buffer, &instance->tds[1]); 215 208 … … 222 215 223 216 transfer_descriptor_init(&instance->tds[i], DEFAULT_ERROR_COUNT, 224 instance->max_packet_size, toggle, false, low_speed,225 instance->target,USB_PID_IN, data, &instance->tds[i + 1]);217 instance->max_packet_size, toggle, false, instance->target, 218 USB_PID_IN, data, &instance->tds[i + 1]); 226 219 } 227 220 … … 229 222 i = instance->packets - 1; 230 223 transfer_descriptor_init(&instance->tds[i], DEFAULT_ERROR_COUNT, 231 0, 1, false, low_speed,instance->target, USB_PID_OUT, NULL, NULL);224 0, 1, false, instance->target, USB_PID_OUT, NULL, NULL); 232 225 233 226 instance->tds[i].status |= TD_STATUS_COMPLETE_INTERRUPT_FLAG; 234 usb_log_debug("Control read last TD status: %x.\n",235 instance->tds[i].status);236 227 237 228 instance->next_step = batch_call_in_and_dispose; … … 243 234 assert(instance); 244 235 245 const bool low_speed = instance->speed == USB_SPEED_LOW;246 236 int toggle = 1; 247 237 size_t i = 0; … … 254 244 255 245 transfer_descriptor_init(&instance->tds[i], DEFAULT_ERROR_COUNT, 256 instance->max_packet_size, toggle, false, low_speed,257 instance->target,USB_PID_IN, data, next);246 instance->max_packet_size, toggle, false, instance->target, 247 USB_PID_IN, data, next); 258 248 } 259 249 … … 270 260 memcpy(instance->transport_buffer, instance->buffer, instance->buffer_size); 271 261 272 const bool low_speed = instance->speed == USB_SPEED_LOW;273 262 int toggle = 1; 274 263 size_t i = 0; … … 281 270 282 271 transfer_descriptor_init(&instance->tds[i], DEFAULT_ERROR_COUNT, 283 instance->max_packet_size, toggle++, false, low_speed,284 instance->target,USB_PID_OUT, data, next);272 instance->max_packet_size, toggle++, false, instance->target, 273 USB_PID_OUT, data, next); 285 274 } 286 275 … … 299 288 300 289 int err = instance->error; 301 usb_log_info("Batch(%p) callback IN(type:%d): %s(%d), %zu.\n", 302 instance, instance->transfer_type, str_error(err), err, 303 instance->transfered_size); 290 usb_log_info("Callback IN(%d): %d, %zu.\n", instance->transfer_type, 291 err, instance->transfered_size); 304 292 305 293 instance->callback_in(instance->fun, … … 314 302 315 303 int err = instance->error; 316 usb_log_info("Batch(%p) callback OUT(type:%d): %s(%d).\n", 317 instance, instance->transfer_type, str_error(err), err); 304 usb_log_info("Callback OUT(%d): %d.\n", instance->transfer_type, err); 318 305 instance->callback_out(instance->fun, 319 306 err, instance->arg); … … 324 311 assert(instance); 325 312 batch_call_in(instance); 326 usb_log_debug(" Batch(%p) disposing.\n", instance);313 usb_log_debug("Disposing batch: %p.\n", instance); 327 314 free32(instance->tds); 328 315 free32(instance->qh); … … 336 323 assert(instance); 337 324 batch_call_out(instance); 338 usb_log_debug(" Batch(%p) disposing.\n", instance);325 usb_log_debug("Disposing batch: %p.\n", instance); 339 326 free32(instance->tds); 340 327 free32(instance->qh); … … 351 338 return uhci_schedule(hc, instance); 352 339 } 340 /*----------------------------------------------------------------------------*/ 341 /* DEPRECATED FUNCTIONS NEEDED BY THE OLD API */ 342 void batch_control_setup_old(batch_t *instance) 343 { 344 assert(instance); 345 instance->packets = 1; 346 347 /* setup stage */ 348 transfer_descriptor_init(instance->tds, DEFAULT_ERROR_COUNT, 349 instance->setup_size, 0, false, instance->target, 350 USB_PID_SETUP, instance->setup_buffer, NULL); 351 352 instance->next_step = batch_call_out_and_dispose; 353 batch_schedule(instance); 354 } 355 /*----------------------------------------------------------------------------*/ 356 void batch_control_write_data_old(batch_t *instance) 357 { 358 assert(instance); 359 instance->packets -= 2; 360 batch_interrupt_out(instance); 361 } 362 /*----------------------------------------------------------------------------*/ 363 void batch_control_read_data_old(batch_t *instance) 364 { 365 assert(instance); 366 instance->packets -= 2; 367 batch_interrupt_in(instance); 368 } 369 /*----------------------------------------------------------------------------*/ 370 void batch_control_write_status_old(batch_t *instance) 371 { 372 assert(instance); 373 instance->packets = 1; 374 transfer_descriptor_init(instance->tds, DEFAULT_ERROR_COUNT, 375 0, 1, false, instance->target, USB_PID_IN, NULL, NULL); 376 instance->next_step = batch_call_in_and_dispose; 377 batch_schedule(instance); 378 } 379 /*----------------------------------------------------------------------------*/ 380 void batch_control_read_status_old(batch_t *instance) 381 { 382 assert(instance); 383 instance->packets = 1; 384 transfer_descriptor_init(instance->tds, DEFAULT_ERROR_COUNT, 385 0, 1, false, instance->target, USB_PID_OUT, NULL, NULL); 386 instance->next_step = batch_call_out_and_dispose; 387 batch_schedule(instance); 388 } 353 389 /** 354 390 * @} -
uspace/drv/uhci-hcd/batch.h
r299d53e r81c508c 43 43 #include "uhci_struct/queue_head.h" 44 44 45 typedef enum { 46 LOW_SPEED, 47 FULL_SPEED, 48 } dev_speed_t; 49 45 50 typedef struct batch 46 51 { 47 52 link_t link; 48 usb_speed_t speed;53 dev_speed_t speed; 49 54 usb_target_t target; 50 55 usb_transfer_type_t transfer_type; … … 71 76 batch_t * batch_get(ddf_fun_t *fun, usb_target_t target, 72 77 usb_transfer_type_t transfer_type, size_t max_packet_size, 73 usb_speed_t speed, char *buffer, size_t size,78 dev_speed_t speed, char *buffer, size_t size, 74 79 char *setup_buffer, size_t setup_size, 75 80 usbhc_iface_transfer_in_callback_t func_in, -
uspace/drv/uhci-hcd/iface.c
r299d53e r81c508c 41 41 #include "iface.h" 42 42 #include "uhci.h" 43 #include "utils/device_keeper.h"44 43 45 44 /*----------------------------------------------------------------------------*/ … … 49 48 uhci_t *hc = fun_to_uhci(fun); 50 49 assert(hc); 51 usb_log_debug("Default address request with speed %d.\n", speed); 52 device_keeper_reserve_default(&hc->device_manager, speed); 50 usb_address_keeping_reserve_default(&hc->address_manager); 53 51 return EOK; 54 52 } … … 59 57 uhci_t *hc = fun_to_uhci(fun); 60 58 assert(hc); 61 usb_log_debug("Default address release.\n"); 62 device_keeper_release_default(&hc->device_manager); 59 usb_address_keeping_release_default(&hc->address_manager); 63 60 return EOK; 64 61 } … … 70 67 uhci_t *hc = fun_to_uhci(fun); 71 68 assert(hc); 72 assert(address); 73 74 usb_log_debug("Address request with speed %d.\n", speed); 75 *address = device_keeper_request(&hc->device_manager, speed); 76 usb_log_debug("Address request with result: %d.\n", *address); 69 *address = usb_address_keeping_request(&hc->address_manager); 77 70 if (*address <= 0) 78 71 return *address; … … 86 79 uhci_t *hc = fun_to_uhci(fun); 87 80 assert(hc); 88 usb_log_debug("Address bind %d-%d.\n", address, handle); 89 device_keeper_bind(&hc->device_manager, address, handle); 81 usb_address_keeping_devman_bind(&hc->address_manager, address, handle); 90 82 return EOK; 91 83 } … … 96 88 uhci_t *hc = fun_to_uhci(fun); 97 89 assert(hc); 98 usb_log_debug("Address release %d.\n", address); 99 device_keeper_release(&hc->device_manager, address); 90 usb_address_keeping_release_default(&hc->address_manager); 100 91 return EOK; 101 92 } 102 93 /*----------------------------------------------------------------------------*/ 103 94 static int interrupt_out(ddf_fun_t *fun, usb_target_t target, 104 size_t max_packet_size, void *data, size_t size, 95 size_t max_packet_size, 96 void *data, size_t size, 105 97 usbhc_iface_transfer_out_callback_t callback, void *arg) 106 98 { 107 assert(fun); 108 uhci_t *hc = fun_to_uhci(fun); 109 assert(hc); 110 usb_speed_t speed = device_keeper_speed(&hc->device_manager, target.address); 111 112 usb_log_debug("Interrupt OUT %d:%d %zu(%zu).\n", 113 target.address, target.endpoint, size, max_packet_size); 99 dev_speed_t speed = FULL_SPEED; 114 100 115 101 batch_t *batch = batch_get(fun, target, USB_TRANSFER_INTERRUPT, … … 122 108 /*----------------------------------------------------------------------------*/ 123 109 static int interrupt_in(ddf_fun_t *fun, usb_target_t target, 124 size_t max_packet_size, void *data, size_t size, 110 size_t max_packet_size, 111 void *data, size_t size, 125 112 usbhc_iface_transfer_in_callback_t callback, void *arg) 126 113 { 127 assert(fun); 128 uhci_t *hc = fun_to_uhci(fun); 129 assert(hc); 130 usb_speed_t speed = device_keeper_speed(&hc->device_manager, target.address); 131 usb_log_debug("Interrupt IN %d:%d %zu(%zu).\n", 132 target.address, target.endpoint, size, max_packet_size); 114 dev_speed_t speed = FULL_SPEED; 133 115 134 116 batch_t *batch = batch_get(fun, target, USB_TRANSFER_INTERRUPT, … … 145 127 usbhc_iface_transfer_out_callback_t callback, void *arg) 146 128 { 147 assert(fun); 148 uhci_t *hc = fun_to_uhci(fun); 149 assert(hc); 150 usb_speed_t speed = device_keeper_speed(&hc->device_manager, target.address); 151 usb_log_debug("Control WRITE %d:%d %zu(%zu).\n", 152 target.address, target.endpoint, size, max_packet_size); 129 dev_speed_t speed = FULL_SPEED; 153 130 154 131 batch_t *batch = batch_get(fun, target, USB_TRANSFER_CONTROL, … … 166 143 usbhc_iface_transfer_in_callback_t callback, void *arg) 167 144 { 168 assert(fun); 169 uhci_t *hc = fun_to_uhci(fun); 170 assert(hc); 171 usb_speed_t speed = device_keeper_speed(&hc->device_manager, target.address); 145 dev_speed_t speed = FULL_SPEED; 172 146 173 usb_log_debug("Control READ %d:%d %zu(%zu).\n",174 target.address, target.endpoint, size, max_packet_size);175 147 batch_t *batch = batch_get(fun, target, USB_TRANSFER_CONTROL, 176 148 max_packet_size, speed, data, size, setup_data, setup_size, callback, -
uspace/drv/uhci-hcd/main.c
r299d53e r81c508c 82 82 usb_log_info("uhci_add_device() called\n"); 83 83 84 uintptr_t io_reg_base = 0; 85 size_t io_reg_size = 0; 86 int irq = 0; 84 85 uintptr_t io_reg_base; 86 size_t io_reg_size; 87 int irq; 87 88 88 89 int ret = … … 94 95 io_reg_base, io_reg_size, irq); 95 96 96 //ret = pci_enable_interrupts(device);97 //CHECK_RET_RETURN(ret, "Failed(%d) to get enable interrupts:\n", ret);97 ret = pci_enable_interrupts(device); 98 CHECK_RET_RETURN(ret, "Failed(%d) to get enable interrupts:\n", ret); 98 99 99 100 uhci_t *uhci_hc = malloc(sizeof(uhci_t)); … … 113 114 */ 114 115 device->driver_data = uhci_hc; 116 115 117 ret = register_interrupt_handler(device, irq, irq_handler, 116 118 &uhci_hc->interrupt_code); … … 147 149 { 148 150 sleep(3); 149 usb_log_enable(USB_LOG_LEVEL_ DEBUG, NAME);151 usb_log_enable(USB_LOG_LEVEL_INFO, NAME); 150 152 151 153 return ddf_driver_main(&uhci_driver); -
uspace/drv/uhci-hcd/pci.c
r299d53e r81c508c 38 38 #include <devman.h> 39 39 #include <device/hw_res.h> 40 41 #include <usb/debug.h>42 40 43 41 #include "pci.h" … … 85 83 irq = res->res.interrupt.irq; 86 84 irq_found = true; 87 usb_log_debug("Found interrupt: %d.\n", irq);88 85 break; 89 86 case IO_RANGE: 90 io_address = res->res.io_range.address; 87 io_address = (uintptr_t) 88 res->res.io_range.address; 91 89 io_size = res->res.io_range.size; 92 usb_log_debug("Found io: %llx %zu %zu.\n",93 res->res.io_range.address, res->res.io_range.size, io_size);94 90 io_found = true; 95 91 break; … … 109 105 } 110 106 111 *io_reg_address = io_address; 112 *io_reg_size = io_size; 113 *irq_no = irq; 107 if (io_reg_address != NULL) { 108 *io_reg_address = io_address; 109 } 110 if (io_reg_size != NULL) { 111 *io_reg_size = io_size; 112 } 113 if (irq_no != NULL) { 114 *irq_no = irq; 115 } 114 116 115 117 rc = EOK; … … 125 127 IPC_FLAG_BLOCKING); 126 128 bool enabled = hw_res_enable_interrupt(parent_phone); 127 async_hangup(parent_phone);128 129 return enabled ? EOK : EIO; 129 130 } -
uspace/drv/uhci-hcd/root_hub.c
r299d53e r81c508c 35 35 #include <errno.h> 36 36 #include <stdio.h> 37 #include <ops/hw_res.h>38 39 37 #include <usb_iface.h> 40 38 #include <usb/debug.h> … … 43 41 #include "uhci.h" 44 42 45 /*----------------------------------------------------------------------------*/46 43 static int usb_iface_get_hc_handle_rh_impl(ddf_fun_t *root_hub_fun, 47 44 devman_handle_t *handle) … … 54 51 return EOK; 55 52 } 56 /*----------------------------------------------------------------------------*/ 53 57 54 static int usb_iface_get_address_rh_impl(ddf_fun_t *fun, devman_handle_t handle, 58 55 usb_address_t *address) … … 64 61 assert(hc); 65 62 66 usb_address_t addr = device_keeper_find(&hc->device_manager,63 usb_address_t addr = usb_address_keeping_find(&hc->address_manager, 67 64 handle); 68 65 if (addr < 0) { … … 76 73 return EOK; 77 74 } 78 /*----------------------------------------------------------------------------*/ 75 79 76 usb_iface_t usb_iface_root_hub_fun_impl = { 80 77 .get_hc_handle = usb_iface_get_hc_handle_rh_impl, 81 78 .get_address = usb_iface_get_address_rh_impl 82 79 }; 83 /*----------------------------------------------------------------------------*/84 static hw_resource_list_t *get_resource_list(ddf_fun_t *dev)85 {86 assert(dev);87 ddf_fun_t *hc_ddf_instance = dev->driver_data;88 assert(hc_ddf_instance);89 uhci_t *hc = hc_ddf_instance->driver_data;90 assert(hc);91 80 92 //TODO: fix memory leak 93 hw_resource_list_t *resource_list = malloc(sizeof(hw_resource_list_t)); 94 assert(resource_list); 95 resource_list->count = 1; 96 resource_list->resources = malloc(sizeof(hw_resource_t)); 97 assert(resource_list->resources); 98 resource_list->resources[0].type = IO_RANGE; 99 resource_list->resources[0].res.io_range.address = 100 ((uintptr_t)hc->registers) + 0x10; // see UHCI design guide 101 resource_list->resources[0].res.io_range.size = 4; 102 resource_list->resources[0].res.io_range.endianness = LITTLE_ENDIAN; 81 static ddf_dev_ops_t root_hub_ops = { 82 .interfaces[USB_DEV_IFACE] = &usb_iface_root_hub_fun_impl 83 }; 103 84 104 return resource_list;105 }106 /*----------------------------------------------------------------------------*/107 static hw_res_ops_t hw_res_iface = {108 .get_resource_list = get_resource_list,109 .enable_interrupt = NULL110 };111 /*----------------------------------------------------------------------------*/112 static ddf_dev_ops_t root_hub_ops = {113 .interfaces[USB_DEV_IFACE] = &usb_iface_root_hub_fun_impl,114 .interfaces[HW_RES_DEV_IFACE] = &hw_res_iface115 };116 85 /*----------------------------------------------------------------------------*/ 117 86 int setup_root_hub(ddf_fun_t **fun, ddf_dev_t *hc) -
uspace/drv/uhci-hcd/transfer_list.c
r299d53e r81c508c 70 70 assert(instance); 71 71 assert(batch); 72 usb_log_debug("Adding batch(%p) to queue %s.\n", batch, instance->name);73 72 74 73 uint32_t pa = (uintptr_t)addr_to_phys(batch->qh); … … 124 123 } 125 124 /*----------------------------------------------------------------------------*/ 126 void transfer_list_ remove_finished(transfer_list_t *instance)125 void transfer_list_check(transfer_list_t *instance) 127 126 { 128 127 assert(instance); 129 130 LIST_INITIALIZE(done);131 132 128 fibril_mutex_lock(&instance->guard); 133 129 link_t *current = instance->batch_list.next; … … 138 134 if (batch_is_complete(batch)) { 139 135 transfer_list_remove_batch(instance, batch); 140 list_append(current, &done);136 batch->next_step(batch); 141 137 } 142 138 current = next; 143 139 } 144 140 fibril_mutex_unlock(&instance->guard); 145 146 while (!list_empty(&done)) {147 link_t *item = done.next;148 list_remove(item);149 batch_t *batch = list_get_instance(item, batch_t, link);150 batch->next_step(batch);151 }152 141 } 153 142 /** -
uspace/drv/uhci-hcd/transfer_list.h
r299d53e r81c508c 60 60 queue_head_dispose(instance->queue_head); 61 61 } 62 void transfer_list_ remove_finished(transfer_list_t *instance);62 void transfer_list_check(transfer_list_t *instance); 63 63 64 64 void transfer_list_add_batch(transfer_list_t *instance, batch_t *batch); -
uspace/drv/uhci-hcd/uhci.c
r299d53e r81c508c 48 48 { 49 49 .cmd = CMD_PIO_READ_16, 50 .addr = NULL, /* patched for every instance */50 .addr = (void*)0xc022, 51 51 .dstarg = 1 52 52 }, 53 53 { 54 54 .cmd = CMD_PIO_WRITE_16, 55 .addr = NULL, /* pathed for every instance */55 .addr = (void*)0xc022, 56 56 .value = 0x1f 57 57 }, … … 68 68 assert(hc); 69 69 70 usb_address_t addr = device_keeper_find(&hc->device_manager,70 usb_address_t addr = usb_address_keeping_find(&hc->address_manager, 71 71 handle); 72 72 if (addr < 0) { … … 80 80 return EOK; 81 81 } 82 /*----------------------------------------------------------------------------*/ 82 83 83 84 static usb_iface_t hc_usb_iface = { 84 85 .get_hc_handle = usb_iface_get_hc_handle_hc_impl, … … 88 89 static ddf_dev_ops_t uhci_ops = { 89 90 .interfaces[USB_DEV_IFACE] = &hc_usb_iface, 90 .interfaces[USBHC_DEV_IFACE] = &uhci_iface ,91 .interfaces[USBHC_DEV_IFACE] = &uhci_iface 91 92 }; 92 93 … … 140 141 141 142 instance->cleaner = fibril_create(uhci_interrupt_emulator, instance); 142 fibril_add_ready(instance->cleaner);143 // fibril_add_ready(instance->cleaner); 143 144 144 145 instance->debug_checker = fibril_create(uhci_debug_checker, instance); … … 150 151 void uhci_init_hw(uhci_t *instance) 151 152 { 152 /* reset everything, who knows what touched it before us */153 pio_write_16(&instance->registers->usbcmd, UHCI_CMD_GLOBAL_RESET);154 async_usleep(10000); /* 10ms according to USB spec */155 pio_write_16(&instance->registers->usbcmd, 0);156 157 /* reset hc, all states and counters */158 pio_write_16(&instance->registers->usbcmd, UHCI_CMD_HCRESET);159 while ((pio_read_16(&instance->registers->usbcmd) & UHCI_CMD_HCRESET) != 0)160 { async_usleep(10); }161 153 162 154 /* set framelist pointer */ … … 211 203 212 204 /* init address keeper(libusb) */ 213 device_keeper_init(&instance->device_manager);214 usb_log_debug("Initialized devicemanager.\n");205 usb_address_keeping_init(&instance->address_manager, USB11_ADDRESS_MAX); 206 usb_log_debug("Initialized address manager.\n"); 215 207 216 208 return EOK; … … 263 255 assert(instance); 264 256 assert(batch); 265 const int low_speed = (batch->speed == USB_SPEED_LOW);257 const int low_speed = (batch->speed == LOW_SPEED); 266 258 if (!allowed_usb_packet( 267 259 low_speed, batch->transfer_type, batch->max_packet_size)) { … … 284 276 { 285 277 assert(instance); 286 //if ((status & (UHCI_STATUS_INTERRUPT | UHCI_STATUS_ERROR_INTERRUPT)) == 0)287 //return;288 // usb_log_debug2("UHCI interrupt: %X.\n", status);289 transfer_list_ remove_finished(&instance->transfers_interrupt);290 transfer_list_ remove_finished(&instance->transfers_control_slow);291 transfer_list_ remove_finished(&instance->transfers_control_full);292 transfer_list_ remove_finished(&instance->transfers_bulk_full);278 if ((status & (UHCI_STATUS_INTERRUPT | UHCI_STATUS_ERROR_INTERRUPT)) == 0) 279 return; 280 usb_log_debug("UHCI interrupt: %X.\n", status); 281 transfer_list_check(&instance->transfers_interrupt); 282 transfer_list_check(&instance->transfers_control_slow); 283 transfer_list_check(&instance->transfers_control_full); 284 transfer_list_check(&instance->transfers_bulk_full); 293 285 } 294 286 /*----------------------------------------------------------------------------*/ … … 299 291 assert(instance); 300 292 301 while 293 while(1) { 302 294 uint16_t status = pio_read_16(&instance->registers->usbsts); 303 if (status != 0)304 usb_log_debug2("UHCI status: %x.\n", status);305 status |= 1;306 295 uhci_interrupt(instance, status); 307 pio_write_16(&instance->registers->usbsts, 0x1f); 308 async_usleep(UHCI_CLEANER_TIMEOUT * 5); 296 async_usleep(UHCI_CLEANER_TIMEOUT); 309 297 } 310 298 return EOK; … … 319 307 const uint16_t sts = pio_read_16(&instance->registers->usbsts); 320 308 const uint16_t intr = pio_read_16(&instance->registers->usbintr); 321 if (((cmd & UHCI_CMD_RUN_STOP) != 1) || (sts != 0)) { 322 usb_log_debug2("Command: %X Status: %X Intr: %x\n", 323 cmd, sts, intr); 324 } 325 326 uintptr_t frame_list = 327 pio_read_32(&instance->registers->flbaseadd) & ~0xfff; 309 usb_log_debug("Command: %X Status: %X Interrupts: %x\n", 310 cmd, sts, intr); 311 312 uintptr_t frame_list = pio_read_32(&instance->registers->flbaseadd); 328 313 if (frame_list != addr_to_phys(instance->frame_list)) { 329 314 usb_log_debug("Framelist address: %p vs. %p.\n", -
uspace/drv/uhci-hcd/uhci.h
r299d53e r81c508c 41 41 #include <ddi.h> 42 42 43 #include <usb/addrkeep.h> 43 44 #include <usbhc_iface.h> 44 45 46 #include "transfer_list.h" 45 47 #include "batch.h" 46 #include "transfer_list.h"47 #include "utils/device_keeper.h"48 48 49 49 typedef struct uhci_regs { … … 82 82 83 83 typedef struct uhci { 84 device_keeper_t device_manager; 85 84 usb_address_keeping_t address_manager; 86 85 volatile regs_t *registers; 87 86 -
uspace/drv/uhci-hcd/uhci_struct/transfer_descriptor.c
r299d53e r81c508c 39 39 40 40 void transfer_descriptor_init(transfer_descriptor_t *instance, 41 int error_count, size_t size, bool toggle, bool isochronous, bool low_speed,41 int error_count, size_t size, bool toggle, bool isochronous, 42 42 usb_target_t target, int pid, void *buffer, transfer_descriptor_t *next) 43 43 { … … 50 50 instance->status = 0 51 51 | ((error_count & TD_STATUS_ERROR_COUNT_MASK) << TD_STATUS_ERROR_COUNT_POS) 52 | (low_speed ? TD_STATUS_LOW_SPEED_FLAG : 0)53 52 | TD_STATUS_ERROR_ACTIVE; 54 53 … … 70 69 instance->next, instance->status, instance->device, 71 70 instance->buffer_ptr, buffer); 71 #if 0 72 if (size) { 73 unsigned char * buff = buffer; 74 uhci_print_verbose("TD Buffer dump(%p-%dB): ", buffer, size); 75 unsigned i = 0; 76 /* TODO: Verbose? */ 77 for (; i < size; ++i) { 78 printf((i & 1) ? "%x " : "%x", buff[i]); 79 } 80 printf("\n"); 81 } 82 #endif 72 83 } 73 84 /*----------------------------------------------------------------------------*/ … … 77 88 78 89 if ((instance->status & TD_STATUS_ERROR_STALLED) != 0) 79 return E STALL;90 return EIO; 80 91 81 92 if ((instance->status & TD_STATUS_ERROR_CRC) != 0) 82 return E BADCHECKSUM;93 return EAGAIN; 83 94 84 95 if ((instance->status & TD_STATUS_ERROR_BUFFER) != 0) -
uspace/drv/uhci-hcd/uhci_struct/transfer_descriptor.h
r299d53e r81c508c 92 92 93 93 void transfer_descriptor_init(transfer_descriptor_t *instance, 94 int error_count, size_t size, bool toggle, bool isochronous, bool low_speed,94 int error_count, size_t size, bool toggle, bool isochronous, 95 95 usb_target_t target, int pid, void *buffer, transfer_descriptor_t * next); 96 96 -
uspace/drv/uhci-rhd/main.c
r299d53e r81c508c 33 33 */ 34 34 #include <ddf/driver.h> 35 #include <devman.h>36 #include <device/hw_res.h>37 35 #include <usb_iface.h> 38 36 #include <usb/ddfiface.h> … … 45 43 46 44 #define NAME "uhci-rhd" 47 static int hc_get_my_registers(ddf_dev_t *dev,48 uintptr_t *io_reg_address, size_t *io_reg_size);49 45 50 46 static int usb_iface_get_hc_handle(ddf_fun_t *fun, devman_handle_t *handle) … … 84 80 } 85 81 86 uintptr_t io_regs = 0; 87 size_t io_size = 0; 88 89 int ret = hc_get_my_registers(device, &io_regs, &io_size); 90 assert(ret == EOK); 91 92 /* TODO: verify values from hc */ 93 usb_log_info("I/O regs at 0x%X (size %zu).\n", io_regs, io_size); 94 ret = uhci_root_hub_init(rh, (void*)io_regs, io_size, device); 82 /* TODO: get register values from hc */ 83 int ret = uhci_root_hub_init(rh, (void*)0xc030, 4, device); 95 84 if (ret != EOK) { 96 85 usb_log_error("Failed(%d) to initialize driver instance.\n", ret); … … 113 102 .driver_ops = &uhci_rh_driver_ops 114 103 }; 115 /*----------------------------------------------------------------------------*/ 104 116 105 int main(int argc, char *argv[]) 117 106 { … … 119 108 return ddf_driver_main(&uhci_rh_driver); 120 109 } 121 /*----------------------------------------------------------------------------*/122 int hc_get_my_registers(ddf_dev_t *dev,123 uintptr_t *io_reg_address, size_t *io_reg_size)124 {125 assert(dev != NULL);126 127 int parent_phone = devman_parent_device_connect(dev->handle,128 IPC_FLAG_BLOCKING);129 if (parent_phone < 0) {130 return parent_phone;131 }132 133 int rc;134 135 hw_resource_list_t hw_resources;136 rc = hw_res_get_resource_list(parent_phone, &hw_resources);137 if (rc != EOK) {138 goto leave;139 }140 141 uintptr_t io_address = 0;142 size_t io_size = 0;143 bool io_found = false;144 145 size_t i;146 for (i = 0; i < hw_resources.count; i++) {147 hw_resource_t *res = &hw_resources.resources[i];148 switch (res->type) {149 case IO_RANGE:150 io_address = (uintptr_t)151 res->res.io_range.address;152 io_size = res->res.io_range.size;153 io_found = true;154 break;155 default:156 break;157 }158 }159 160 if (!io_found) {161 rc = ENOENT;162 goto leave;163 }164 165 if (io_reg_address != NULL) {166 *io_reg_address = io_address;167 }168 if (io_reg_size != NULL) {169 *io_reg_size = io_size;170 }171 rc = EOK;172 leave:173 async_hangup(parent_phone);174 175 return rc;176 }177 110 /** 178 111 * @} -
uspace/drv/uhci-rhd/port.c
r299d53e r81c508c 34 34 #include <errno.h> 35 35 #include <str_error.h> 36 #include <fibril_synch.h>37 36 38 37 #include <usb/usb.h> /* usb_address_t */ … … 46 45 #include "port_status.h" 47 46 48 static int uhci_port_new_device(uhci_port_t *port , uint16_t status);47 static int uhci_port_new_device(uhci_port_t *port); 49 48 static int uhci_port_remove_device(uhci_port_t *port); 50 49 static int uhci_port_set_enabled(uhci_port_t *port, bool enabled); 51 50 static int uhci_port_check(void *port); 52 static int new_device_enable_port(int portno, void *arg);53 51 54 52 int uhci_port_init( 55 53 uhci_port_t *port, port_status_t *address, unsigned number, 56 unsigned usec, ddf_dev_t *rh )54 unsigned usec, ddf_dev_t *rh, int parent_phone) 57 55 { 58 56 assert(port); … … 92 90 uhci_port_t *port_instance = port; 93 91 assert(port_instance); 94 port_status_write(port_instance->address, 0);95 96 uint64_t count = 0;97 92 98 93 while (1) { 99 async_usleep(port_instance->wait_period_usec);100 101 94 /* read register value */ 102 95 port_status_t port_status = … … 104 97 105 98 /* debug print */ 106 static fibril_mutex_t dbg_mtx = FIBRIL_MUTEX_INITIALIZER(dbg_mtx); 107 fibril_mutex_lock(&dbg_mtx); 108 usb_log_debug("Port %d status at %p: 0x%04x. === %llu\n", 109 port_instance->number, port_instance->address, port_status, count++); 110 // print_port_status(port_status); 111 fibril_mutex_unlock(&dbg_mtx); 112 113 if ((port_status & STATUS_CONNECTED_CHANGED) != 0) { 114 usb_log_debug("Change detected on port %d: %x.\n", 115 port_instance->number, port_status); 116 117 99 usb_log_debug("Port %d status at %p: 0x%04x.\n", 100 port_instance->number, port_instance->address, port_status); 101 print_port_status(port_status); 102 103 if (port_status & STATUS_CONNECTED_CHANGED) { 118 104 int rc = usb_hc_connection_open( 119 105 &port_instance->hc_connection); 120 106 if (rc != EOK) { 121 107 usb_log_error("Failed to connect to HC."); 122 continue;108 goto next; 123 109 } 124 110 125 /* remove any old device */126 if (port_instance->attached_device) {127 u sb_log_debug("Removing device on port %d.\n",128 port_instance->number);111 if (port_status & STATUS_CONNECTED) { 112 /* new device */ 113 uhci_port_new_device(port_instance); 114 } else { 129 115 uhci_port_remove_device(port_instance); 130 }131 132 if ((port_status & STATUS_CONNECTED) != 0) {133 /* new device */134 uhci_port_new_device(port_instance, port_status);135 } else {136 /* ack changes by writing one to WC bits */137 port_status_write(port_instance->address, port_status);138 usb_log_debug("Change status ack on port %d.\n",139 port_instance->number);140 116 } 141 117 … … 144 120 if (rc != EOK) { 145 121 usb_log_error("Failed to disconnect from HC."); 122 goto next; 146 123 } 147 124 } 125 next: 126 async_usleep(port_instance->wait_period_usec); 148 127 } 149 128 return EOK; … … 168 147 async_usleep(100000); 169 148 149 /* Enable the port. */ 150 uhci_port_set_enabled(port, true); 170 151 171 152 /* The hub maintains the reset signal to that port for 10 ms … … 188 169 } 189 170 190 /* Enable the port. */ 191 uhci_port_set_enabled(port, true); 192 193 return EOK; 194 } 195 196 /*----------------------------------------------------------------------------*/ 197 static int uhci_port_new_device(uhci_port_t *port, uint16_t status) 171 return EOK; 172 } 173 174 /*----------------------------------------------------------------------------*/ 175 static int uhci_port_new_device(uhci_port_t *port) 198 176 { 199 177 assert(port); … … 204 182 usb_address_t dev_addr; 205 183 int rc = usb_hc_new_device_wrapper(port->rh, &port->hc_connection, 206 ((status & STATUS_LOW_SPEED) != 0) ? USB_SPEED_LOW :USB_SPEED_FULL,184 USB_SPEED_FULL, 207 185 new_device_enable_port, port->number, port, 208 186 &dev_addr, &port->attached_device, NULL, NULL, NULL); 209 210 187 if (rc != EOK) { 211 188 usb_log_error("Failed adding new device on port %u: %s.\n", -
uspace/drv/uhci-rhd/port.h
r299d53e r81c508c 55 55 int uhci_port_init( 56 56 uhci_port_t *port, port_status_t *address, unsigned number, 57 unsigned usec, ddf_dev_t *rh );57 unsigned usec, ddf_dev_t *rh, int parent_phone); 58 58 59 59 void uhci_port_fini(uhci_port_t *port); -
uspace/drv/uhci-rhd/port_status.c
r299d53e r81c508c 41 41 struct flag_name 42 42 { 43 u int16_tflag;43 unsigned flag; 44 44 const char *name; 45 45 }; … … 65 65 for (;i < sizeof(flags)/sizeof(struct flag_name); ++i) { 66 66 usb_log_debug2("\t%s status: %s.\n", flags[i].name, 67 ((value & flags[i].flag) != 0)? "YES" : "NO");67 value & flags[i].flag ? "YES" : "NO"); 68 68 } 69 69 } -
uspace/drv/uhci-rhd/port_status.h
r299d53e r81c508c 41 41 typedef uint16_t port_status_t; 42 42 43 #define STATUS_CONNECTED (1 << 0) 44 #define STATUS_CONNECTED_CHANGED (1 << 1) 45 #define STATUS_ENABLED (1 << 2) 46 #define STATUS_ENABLED_CHANGED (1 << 3) 47 #define STATUS_LINE_D_PLUS (1 << 4) 48 #define STATUS_LINE_D_MINUS (1 << 5) 49 #define STATUS_RESUME (1 << 6) 50 #define STATUS_ALWAYS_ONE (1 << 7) 43 enum { 44 STATUS_CONNECTED = 1 << 0, 45 STATUS_CONNECTED_CHANGED = 1 << 1, 46 STATUS_ENABLED = 1 << 2, 47 STATUS_ENABLED_CHANGED = 1 << 3, 48 STATUS_LINE_D_PLUS = 1 << 4, 49 STATUS_LINE_D_MINUS = 1 << 5, 50 STATUS_RESUME = 1 << 6, 51 STATUS_ALWAYS_ONE = 1 << 7, 51 52 52 #define STATUS_LOW_SPEED (1 << 8) 53 #define STATUS_IN_RESET (1 << 9) 54 #define STATUS_SUSPEND (1 << 12) 53 STATUS_LOW_SPEED = 1 << 8, 54 STATUS_IN_RESET = 1 << 9, 55 STATUS_SUSPEND = 1 << 12, 56 }; 55 57 56 58 static inline port_status_t port_status_read(port_status_t * address) -
uspace/drv/uhci-rhd/root_hub.c
r299d53e r81c508c 40 40 #include "root_hub.h" 41 41 42 42 43 int uhci_root_hub_init( 43 44 uhci_root_hub_t *instance, void *addr, size_t size, ddf_dev_t *rh) … … 66 67 unsigned i = 0; 67 68 for (; i < UHCI_ROOT_HUB_PORT_COUNT; ++i) { 69 /* connect to the parent device (HC) */ 70 int parent_phone = devman_device_connect(instance->hc_handle, 0); 71 //usb_drv_hc_connect(rh, instance->hc_handle, 0); 72 if (parent_phone < 0) { 73 usb_log_error("Failed to connect to the HC device port %d.\n", i); 74 return parent_phone; 75 } 68 76 /* mind pointer arithmetics */ 69 77 int ret = uhci_port_init( 70 &instance->ports[i], regs + i, i, ROOT_HUB_WAIT_USEC, rh );78 &instance->ports[i], regs + i, i, ROOT_HUB_WAIT_USEC, rh, parent_phone); 71 79 if (ret != EOK) { 72 80 unsigned j = 0; -
uspace/drv/uhci-rhd/root_hub.h
r299d53e r81c508c 41 41 42 42 #define UHCI_ROOT_HUB_PORT_COUNT 2 43 #define ROOT_HUB_WAIT_USEC 5000000 /* 5 seconds */ 43 #define UHCI_ROOT_HUB_PORT_REGISTERS_OFFSET 0x10 44 #define ROOT_HUB_WAIT_USEC 10000000 /* 10 seconds */ 44 45 45 46 typedef struct root_hub {
Note:
See TracChangeset
for help on using the changeset viewer.