Changes in / [81c508c:cc44f7e] in mainline
- Location:
- uspace/drv
- Files:
-
- 2 added
- 21 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/pciintel/pci.c
r81c508c rcc44f7e 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) 322 325 323 326 io = (bool) (val & 1); 324 327 if (io) { 325 328 addrw64 = false; 329 mask = IO_MASK; 326 330 } else { 331 mask = MEM_MASK; 327 332 switch ((val >> 1) & 3) { 328 333 case 0: … … 340 345 /* Get the address mask. */ 341 346 pci_conf_write_32(fun, addr, 0xffffffff); 342 mask = pci_conf_read_32(fun, addr);347 mask &= pci_conf_read_32(fun, addr); 343 348 344 349 /* Restore the original value. */ … … 659 664 size_t pci_bar_mask_to_size(uint32_t mask) 660 665 { 661 return ((mask & 0xfffffff0) ^ 0xffffffff) + 1; 666 size_t size = mask & ~(mask - 1); 667 return size; 662 668 } 663 669 -
uspace/drv/uhci-hcd/Makefile
r81c508c rcc44f7e 39 39 uhci.c \ 40 40 uhci_struct/transfer_descriptor.c \ 41 utils/device_keeper.c \ 41 42 pci.c \ 42 43 batch.c -
uspace/drv/uhci-hcd/batch.c
r81c508c rcc44f7e 33 33 */ 34 34 #include <errno.h> 35 #include <str_error.h> 35 36 36 37 #include <usb/debug.h> … … 53 54 batch_t * batch_get(ddf_fun_t *fun, usb_target_t target, 54 55 usb_transfer_type_t transfer_type, size_t max_packet_size, 55 dev_speed_t speed, char *buffer, size_t size,56 usb_speed_t speed, char *buffer, size_t size, 56 57 char* setup_buffer, size_t setup_size, 57 58 usbhc_iface_transfer_in_callback_t func_in, … … 133 134 134 135 queue_head_element_td(instance->qh, addr_to_phys(instance->tds)); 136 usb_log_debug("Batch(%p) %d:%d memory structures ready.\n", 137 instance, target.address, target.endpoint); 135 138 return instance; 136 139 } … … 139 142 { 140 143 assert(instance); 141 usb_log_debug ("Checking(%p) %d packetfor completion.\n",144 usb_log_debug2("Batch(%p) checking %d packet(s) for completion.\n", 142 145 instance, instance->packets); 143 146 instance->transfered_size = 0; … … 151 154 if (i > 0) 152 155 instance->transfered_size -= instance->setup_size; 156 usb_log_debug("Batch(%p) found error TD(%d):%x.\n", 157 instance, i, instance->tds[i].status); 153 158 return true; 154 159 } … … 156 161 transfer_descriptor_actual_size(&instance->tds[i]); 157 162 } 158 /* This is just an ugly trick to support the old API */159 163 instance->transfered_size -= instance->setup_size; 160 164 return true; … … 168 172 memcpy(instance->transport_buffer, instance->buffer, instance->buffer_size); 169 173 174 const bool low_speed = instance->speed == USB_SPEED_LOW; 170 175 int toggle = 0; 171 176 /* setup stage */ 172 177 transfer_descriptor_init(instance->tds, DEFAULT_ERROR_COUNT, 173 instance->setup_size, toggle, false, instance->target, 174 USB_PID_SETUP, instance->setup_buffer, &instance->tds[1]); 178 instance->setup_size, toggle, false, low_speed, 179 instance->target, USB_PID_SETUP, instance->setup_buffer, 180 &instance->tds[1]); 175 181 176 182 /* data stage */ … … 182 188 183 189 transfer_descriptor_init(&instance->tds[i], DEFAULT_ERROR_COUNT, 184 instance->max_packet_size, toggle++, false, instance->target,185 USB_PID_OUT, data, &instance->tds[i + 1]);190 instance->max_packet_size, toggle++, false, low_speed, 191 instance->target, USB_PID_OUT, data, &instance->tds[i + 1]); 186 192 } 187 193 … … 189 195 i = instance->packets - 1; 190 196 transfer_descriptor_init(&instance->tds[i], DEFAULT_ERROR_COUNT, 191 0, 1, false, instance->target, USB_PID_IN, NULL, NULL);197 0, 1, false, low_speed, instance->target, USB_PID_IN, NULL, NULL); 192 198 193 199 instance->tds[i].status |= TD_STATUS_COMPLETE_INTERRUPT_FLAG; 200 usb_log_debug2("Control write last TD status: %x.\n", 201 instance->tds[i].status); 194 202 195 203 instance->next_step = batch_call_out_and_dispose; 204 usb_log_debug("Batch(%p) CONTROL WRITE initialized.\n", instance); 196 205 batch_schedule(instance); 197 206 } … … 201 210 assert(instance); 202 211 212 const bool low_speed = instance->speed == USB_SPEED_LOW; 203 213 int toggle = 0; 204 214 /* setup stage */ 205 215 transfer_descriptor_init(instance->tds, DEFAULT_ERROR_COUNT, 206 instance->setup_size, toggle, false, instance->target,216 instance->setup_size, toggle, false, low_speed, instance->target, 207 217 USB_PID_SETUP, instance->setup_buffer, &instance->tds[1]); 208 218 … … 215 225 216 226 transfer_descriptor_init(&instance->tds[i], DEFAULT_ERROR_COUNT, 217 instance->max_packet_size, toggle, false, instance->target,218 227 instance->max_packet_size, toggle, false, low_speed, 228 instance->target, USB_PID_IN, data, &instance->tds[i + 1]); 219 229 } 220 230 … … 222 232 i = instance->packets - 1; 223 233 transfer_descriptor_init(&instance->tds[i], DEFAULT_ERROR_COUNT, 224 0, 1, false, instance->target, USB_PID_OUT, NULL, NULL);234 0, 1, false, low_speed, instance->target, USB_PID_OUT, NULL, NULL); 225 235 226 236 instance->tds[i].status |= TD_STATUS_COMPLETE_INTERRUPT_FLAG; 237 usb_log_debug2("Control read last TD status: %x.\n", 238 instance->tds[i].status); 227 239 228 240 instance->next_step = batch_call_in_and_dispose; 241 usb_log_debug("Batch(%p) CONTROL READ initialized.\n", instance); 229 242 batch_schedule(instance); 230 243 } … … 234 247 assert(instance); 235 248 249 const bool low_speed = instance->speed == USB_SPEED_LOW; 236 250 int toggle = 1; 237 251 size_t i = 0; … … 244 258 245 259 transfer_descriptor_init(&instance->tds[i], DEFAULT_ERROR_COUNT, 246 instance->max_packet_size, toggle, false, instance->target,247 USB_PID_IN, data, next);260 instance->max_packet_size, toggle, false, low_speed, 261 instance->target, USB_PID_IN, data, next); 248 262 } 249 263 … … 251 265 252 266 instance->next_step = batch_call_in_and_dispose; 267 usb_log_debug("Batch(%p) INTERRUPT IN initialized.\n", instance); 253 268 batch_schedule(instance); 254 269 } … … 260 275 memcpy(instance->transport_buffer, instance->buffer, instance->buffer_size); 261 276 277 const bool low_speed = instance->speed == USB_SPEED_LOW; 262 278 int toggle = 1; 263 279 size_t i = 0; … … 270 286 271 287 transfer_descriptor_init(&instance->tds[i], DEFAULT_ERROR_COUNT, 272 instance->max_packet_size, toggle++, false, instance->target,273 USB_PID_OUT, data, next);288 instance->max_packet_size, toggle++, false, low_speed, 289 instance->target, USB_PID_OUT, data, next); 274 290 } 275 291 … … 277 293 278 294 instance->next_step = batch_call_out_and_dispose; 295 usb_log_debug("Batch(%p) INTERRUPT OUT initialized.\n", instance); 279 296 batch_schedule(instance); 280 297 } … … 288 305 289 306 int err = instance->error; 290 usb_log_info("Callback IN(%d): %d, %zu.\n", instance->transfer_type, 291 err, instance->transfered_size); 307 usb_log_debug("Batch(%p) callback IN(type:%d): %s(%d), %zu.\n", 308 instance, instance->transfer_type, str_error(err), err, 309 instance->transfered_size); 292 310 293 311 instance->callback_in(instance->fun, … … 302 320 303 321 int err = instance->error; 304 usb_log_info("Callback OUT(%d): %d.\n", instance->transfer_type, err); 322 usb_log_debug("Batch(%p) callback OUT(type:%d): %s(%d).\n", 323 instance, instance->transfer_type, str_error(err), err); 305 324 instance->callback_out(instance->fun, 306 325 err, instance->arg); … … 311 330 assert(instance); 312 331 batch_call_in(instance); 313 usb_log_debug(" Disposing batch: %p.\n", instance);332 usb_log_debug("Batch(%p) disposing.\n", instance); 314 333 free32(instance->tds); 315 334 free32(instance->qh); … … 323 342 assert(instance); 324 343 batch_call_out(instance); 325 usb_log_debug(" Disposing batch: %p.\n", instance);344 usb_log_debug("Batch(%p) disposing.\n", instance); 326 345 free32(instance->tds); 327 346 free32(instance->qh); … … 338 357 return uhci_schedule(hc, instance); 339 358 } 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 }389 359 /** 390 360 * @} -
uspace/drv/uhci-hcd/batch.h
r81c508c rcc44f7e 43 43 #include "uhci_struct/queue_head.h" 44 44 45 typedef enum {46 LOW_SPEED,47 FULL_SPEED,48 } dev_speed_t;49 50 45 typedef struct batch 51 46 { 52 47 link_t link; 53 dev_speed_t speed;48 usb_speed_t speed; 54 49 usb_target_t target; 55 50 usb_transfer_type_t transfer_type; … … 76 71 batch_t * batch_get(ddf_fun_t *fun, usb_target_t target, 77 72 usb_transfer_type_t transfer_type, size_t max_packet_size, 78 dev_speed_t speed, char *buffer, size_t size,73 usb_speed_t speed, char *buffer, size_t size, 79 74 char *setup_buffer, size_t setup_size, 80 75 usbhc_iface_transfer_in_callback_t func_in, -
uspace/drv/uhci-hcd/iface.c
r81c508c rcc44f7e 41 41 #include "iface.h" 42 42 #include "uhci.h" 43 #include "utils/device_keeper.h" 43 44 44 45 /*----------------------------------------------------------------------------*/ … … 48 49 uhci_t *hc = fun_to_uhci(fun); 49 50 assert(hc); 50 usb_address_keeping_reserve_default(&hc->address_manager); 51 usb_log_debug("Default address request with speed %d.\n", speed); 52 device_keeper_reserve_default(&hc->device_manager, speed); 51 53 return EOK; 52 54 } … … 57 59 uhci_t *hc = fun_to_uhci(fun); 58 60 assert(hc); 59 usb_address_keeping_release_default(&hc->address_manager); 61 usb_log_debug("Default address release.\n"); 62 device_keeper_release_default(&hc->device_manager); 60 63 return EOK; 61 64 } … … 67 70 uhci_t *hc = fun_to_uhci(fun); 68 71 assert(hc); 69 *address = usb_address_keeping_request(&hc->address_manager); 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); 70 77 if (*address <= 0) 71 78 return *address; … … 79 86 uhci_t *hc = fun_to_uhci(fun); 80 87 assert(hc); 81 usb_address_keeping_devman_bind(&hc->address_manager, address, handle); 88 usb_log_debug("Address bind %d-%d.\n", address, handle); 89 device_keeper_bind(&hc->device_manager, address, handle); 82 90 return EOK; 83 91 } … … 88 96 uhci_t *hc = fun_to_uhci(fun); 89 97 assert(hc); 90 usb_address_keeping_release_default(&hc->address_manager); 98 usb_log_debug("Address release %d.\n", address); 99 device_keeper_release(&hc->device_manager, address); 91 100 return EOK; 92 101 } 93 102 /*----------------------------------------------------------------------------*/ 94 103 static int interrupt_out(ddf_fun_t *fun, usb_target_t target, 95 size_t max_packet_size, 96 void *data, size_t size, 104 size_t max_packet_size, void *data, size_t size, 97 105 usbhc_iface_transfer_out_callback_t callback, void *arg) 98 106 { 99 dev_speed_t speed = FULL_SPEED; 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); 100 114 101 115 batch_t *batch = batch_get(fun, target, USB_TRANSFER_INTERRUPT, … … 108 122 /*----------------------------------------------------------------------------*/ 109 123 static int interrupt_in(ddf_fun_t *fun, usb_target_t target, 110 size_t max_packet_size, 111 void *data, size_t size, 124 size_t max_packet_size, void *data, size_t size, 112 125 usbhc_iface_transfer_in_callback_t callback, void *arg) 113 126 { 114 dev_speed_t speed = FULL_SPEED; 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); 115 133 116 134 batch_t *batch = batch_get(fun, target, USB_TRANSFER_INTERRUPT, … … 127 145 usbhc_iface_transfer_out_callback_t callback, void *arg) 128 146 { 129 dev_speed_t speed = FULL_SPEED; 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); 130 153 131 154 batch_t *batch = batch_get(fun, target, USB_TRANSFER_CONTROL, … … 143 166 usbhc_iface_transfer_in_callback_t callback, void *arg) 144 167 { 145 dev_speed_t speed = FULL_SPEED; 146 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); 172 173 usb_log_debug("Control READ %d:%d %zu(%zu).\n", 174 target.address, target.endpoint, size, max_packet_size); 147 175 batch_t *batch = batch_get(fun, target, USB_TRANSFER_CONTROL, 148 176 max_packet_size, speed, data, size, setup_data, setup_size, callback, -
uspace/drv/uhci-hcd/main.c
r81c508c rcc44f7e 82 82 usb_log_info("uhci_add_device() called\n"); 83 83 84 85 uintptr_t io_reg_base; 86 size_t io_reg_size; 87 int irq; 84 uintptr_t io_reg_base = 0; 85 size_t io_reg_size = 0; 86 int irq = 0; 88 87 89 88 int ret = … … 95 94 io_reg_base, io_reg_size, irq); 96 95 97 ret = pci_enable_interrupts(device);98 CHECK_RET_RETURN(ret, "Failed(%d) to get enable interrupts:\n", ret);96 // ret = pci_enable_interrupts(device); 97 // CHECK_RET_RETURN(ret, "Failed(%d) to get enable interrupts:\n", ret); 99 98 100 99 uhci_t *uhci_hc = malloc(sizeof(uhci_t)); … … 114 113 */ 115 114 device->driver_data = uhci_hc; 116 117 115 ret = register_interrupt_handler(device, irq, irq_handler, 118 116 &uhci_hc->interrupt_code); … … 149 147 { 150 148 sleep(3); 151 usb_log_enable(USB_LOG_LEVEL_ INFO, NAME);149 usb_log_enable(USB_LOG_LEVEL_DEBUG, NAME); 152 150 153 151 return ddf_driver_main(&uhci_driver); -
uspace/drv/uhci-hcd/pci.c
r81c508c rcc44f7e 38 38 #include <devman.h> 39 39 #include <device/hw_res.h> 40 41 #include <usb/debug.h> 40 42 41 43 #include "pci.h" … … 83 85 irq = res->res.interrupt.irq; 84 86 irq_found = true; 87 usb_log_debug2("Found interrupt: %d.\n", irq); 85 88 break; 86 89 case IO_RANGE: 87 io_address = (uintptr_t) 88 res->res.io_range.address; 90 io_address = res->res.io_range.address; 89 91 io_size = res->res.io_range.size; 92 usb_log_debug2("Found io: %llx %zu.\n", 93 res->res.io_range.address, res->res.io_range.size); 90 94 io_found = true; 91 95 break; … … 105 109 } 106 110 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 } 111 *io_reg_address = io_address; 112 *io_reg_size = io_size; 113 *irq_no = irq; 116 114 117 115 rc = EOK; … … 127 125 IPC_FLAG_BLOCKING); 128 126 bool enabled = hw_res_enable_interrupt(parent_phone); 127 async_hangup(parent_phone); 129 128 return enabled ? EOK : EIO; 130 129 } -
uspace/drv/uhci-hcd/root_hub.c
r81c508c rcc44f7e 34 34 #include <assert.h> 35 35 #include <errno.h> 36 #include <str_error.h> 36 37 #include <stdio.h> 38 #include <ops/hw_res.h> 39 37 40 #include <usb_iface.h> 38 41 #include <usb/debug.h> … … 41 44 #include "uhci.h" 42 45 46 /*----------------------------------------------------------------------------*/ 43 47 static int usb_iface_get_hc_handle_rh_impl(ddf_fun_t *root_hub_fun, 44 48 devman_handle_t *handle) … … 51 55 return EOK; 52 56 } 53 57 /*----------------------------------------------------------------------------*/ 54 58 static int usb_iface_get_address_rh_impl(ddf_fun_t *fun, devman_handle_t handle, 55 59 usb_address_t *address) … … 61 65 assert(hc); 62 66 63 usb_address_t addr = usb_address_keeping_find(&hc->address_manager,67 usb_address_t addr = device_keeper_find(&hc->device_manager, 64 68 handle); 65 69 if (addr < 0) { … … 73 77 return EOK; 74 78 } 75 79 /*----------------------------------------------------------------------------*/ 76 80 usb_iface_t usb_iface_root_hub_fun_impl = { 77 81 .get_hc_handle = usb_iface_get_hc_handle_rh_impl, 78 82 .get_address = usb_iface_get_address_rh_impl 79 83 }; 84 /*----------------------------------------------------------------------------*/ 85 static hw_resource_list_t *get_resource_list(ddf_fun_t *dev) 86 { 87 assert(dev); 88 ddf_fun_t *hc_ddf_instance = dev->driver_data; 89 assert(hc_ddf_instance); 90 uhci_t *hc = hc_ddf_instance->driver_data; 91 assert(hc); 80 92 93 //TODO: fix memory leak 94 hw_resource_list_t *resource_list = malloc(sizeof(hw_resource_list_t)); 95 assert(resource_list); 96 resource_list->count = 1; 97 resource_list->resources = malloc(sizeof(hw_resource_t)); 98 assert(resource_list->resources); 99 resource_list->resources[0].type = IO_RANGE; 100 resource_list->resources[0].res.io_range.address = 101 ((uintptr_t)hc->registers) + 0x10; // see UHCI design guide 102 resource_list->resources[0].res.io_range.size = 4; 103 resource_list->resources[0].res.io_range.endianness = LITTLE_ENDIAN; 104 105 return resource_list; 106 } 107 /*----------------------------------------------------------------------------*/ 108 static hw_res_ops_t hw_res_iface = { 109 .get_resource_list = get_resource_list, 110 .enable_interrupt = NULL 111 }; 112 /*----------------------------------------------------------------------------*/ 81 113 static ddf_dev_ops_t root_hub_ops = { 82 .interfaces[USB_DEV_IFACE] = &usb_iface_root_hub_fun_impl 114 .interfaces[USB_DEV_IFACE] = &usb_iface_root_hub_fun_impl, 115 .interfaces[HW_RES_DEV_IFACE] = &hw_res_iface 83 116 }; 84 85 117 /*----------------------------------------------------------------------------*/ 86 118 int setup_root_hub(ddf_fun_t **fun, ddf_dev_t *hc) 87 119 { 88 120 assert(fun); 121 assert(hc); 89 122 int ret; 90 123 … … 105 138 ret = ddf_fun_add_match_id(hub, match_str, 100); 106 139 if (ret != EOK) { 107 usb_log_error("Failed to add root hub match id.\n"); 140 usb_log_error("Failed(%d) to add root hub match id: %s\n", 141 ret, str_error(ret)); 108 142 ddf_fun_destroy(hub); 109 return ENOMEM;143 return ret; 110 144 } 111 145 -
uspace/drv/uhci-hcd/transfer_list.c
r81c508c rcc44f7e 70 70 assert(instance); 71 71 assert(batch); 72 usb_log_debug2("Adding batch(%p) to queue %s.\n", batch, instance->name); 72 73 73 74 uint32_t pa = (uintptr_t)addr_to_phys(batch->qh); … … 83 84 list_append(&batch->link, &instance->batch_list); 84 85 instance->queue_head->element = pa; 85 usb_log_debug 2("Added batch(%p)to queue %s first.\n",86 usb_log_debug("Batch(%p) added to queue %s first.\n", 86 87 batch, instance->name); 87 88 fibril_mutex_unlock(&instance->guard); … … 96 97 queue_head_append_qh(last->qh, pa); 97 98 list_append(&batch->link, &instance->batch_list); 98 usb_log_debug 2("Added batch(%p)to queue %s last, first is %p.\n",99 usb_log_debug("Batch(%p) added to queue %s last, first is %p.\n", 99 100 batch, instance->name, first ); 100 101 fibril_mutex_unlock(&instance->guard); … … 108 109 assert(instance->queue_head); 109 110 assert(batch->qh); 111 usb_log_debug2("Removing batch(%p) from queue %s.\n", batch, instance->name); 110 112 111 113 /* I'm the first one here */ 112 114 if (batch->link.prev == &instance->batch_list) { 113 usb_log_debug(" Removing batch %p was first, next element %x.\n",114 batch, batch->qh->next_queue);115 usb_log_debug("Batch(%p) removed (FIRST) from queue %s, next element %x.\n", 116 batch, instance->name, batch->qh->next_queue); 115 117 instance->queue_head->element = batch->qh->next_queue; 116 118 } else { 117 usb_log_debug(" Removing batch %p was NOT first, next element %x.\n",118 batch, batch->qh->next_queue);119 usb_log_debug("Batch(%p) removed (NOT FIRST) from queue, next element %x.\n", 120 batch, instance->name, batch->qh->next_queue); 119 121 batch_t *prev = list_get_instance(batch->link.prev, batch_t, link); 120 122 prev->qh->next_queue = batch->qh->next_queue; … … 123 125 } 124 126 /*----------------------------------------------------------------------------*/ 125 void transfer_list_ check(transfer_list_t *instance)127 void transfer_list_remove_finished(transfer_list_t *instance) 126 128 { 127 129 assert(instance); 130 131 LIST_INITIALIZE(done); 132 128 133 fibril_mutex_lock(&instance->guard); 129 134 link_t *current = instance->batch_list.next; … … 134 139 if (batch_is_complete(batch)) { 135 140 transfer_list_remove_batch(instance, batch); 136 batch->next_step(batch);141 list_append(current, &done); 137 142 } 138 143 current = next; 139 144 } 140 145 fibril_mutex_unlock(&instance->guard); 146 147 while (!list_empty(&done)) { 148 link_t *item = done.next; 149 list_remove(item); 150 batch_t *batch = list_get_instance(item, batch_t, link); 151 batch->next_step(batch); 152 } 141 153 } 142 154 /** -
uspace/drv/uhci-hcd/transfer_list.h
r81c508c rcc44f7e 60 60 queue_head_dispose(instance->queue_head); 61 61 } 62 void transfer_list_ check(transfer_list_t *instance);62 void transfer_list_remove_finished(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
r81c508c rcc44f7e 48 48 { 49 49 .cmd = CMD_PIO_READ_16, 50 .addr = (void*)0xc022,50 .addr = NULL, /* patched for every instance */ 51 51 .dstarg = 1 52 52 }, 53 53 { 54 54 .cmd = CMD_PIO_WRITE_16, 55 .addr = (void*)0xc022,55 .addr = NULL, /* pathed for every instance */ 56 56 .value = 0x1f 57 57 }, … … 68 68 assert(hc); 69 69 70 usb_address_t addr = usb_address_keeping_find(&hc->address_manager,70 usb_address_t addr = device_keeper_find(&hc->device_manager, 71 71 handle); 72 72 if (addr < 0) { … … 80 80 return EOK; 81 81 } 82 83 82 /*----------------------------------------------------------------------------*/ 84 83 static usb_iface_t hc_usb_iface = { 85 84 .get_hc_handle = usb_iface_get_hc_handle_hc_impl, … … 89 88 static ddf_dev_ops_t uhci_ops = { 90 89 .interfaces[USB_DEV_IFACE] = &hc_usb_iface, 91 .interfaces[USBHC_DEV_IFACE] = &uhci_iface 90 .interfaces[USBHC_DEV_IFACE] = &uhci_iface, 92 91 }; 93 92 … … 102 101 bool low_speed, usb_transfer_type_t, size_t size); 103 102 104 #define CHECK_RET_RETURN(ret, message...) \ 103 104 int uhci_init(uhci_t *instance, ddf_dev_t *dev, void *regs, size_t reg_size) 105 { 106 assert(reg_size >= sizeof(regs_t)); 107 int ret; 108 109 #define CHECK_RET_DEST_FUN_RETURN(ret, message...) \ 105 110 if (ret != EOK) { \ 106 111 usb_log_error(message); \ 112 if (instance->ddf_instance) \ 113 ddf_fun_destroy(instance->ddf_instance); \ 107 114 return ret; \ 108 115 } else (void) 0 109 110 int uhci_init(uhci_t *instance, ddf_dev_t *dev, void *regs, size_t reg_size)111 {112 assert(reg_size >= sizeof(regs_t));113 int ret;114 116 115 117 /* … … 117 119 */ 118 120 instance->ddf_instance = ddf_fun_create(dev, fun_exposed, "uhci"); 119 if (instance->ddf_instance == NULL) { 120 usb_log_error("Failed to create UHCI device function.\n"); 121 return ENOMEM; 122 } 121 ret = (instance->ddf_instance == NULL) ? ENOMEM : EOK; 122 CHECK_RET_DEST_FUN_RETURN(ret, "Failed to create UHCI device function.\n"); 123 123 124 instance->ddf_instance->ops = &uhci_ops; 124 125 instance->ddf_instance->driver_data = instance; 125 126 126 127 ret = ddf_fun_bind(instance->ddf_instance); 127 CHECK_RET_ RETURN(ret, "Failedto bind UHCI device function: %s.\n",128 str_error(ret));128 CHECK_RET_DEST_FUN_RETURN(ret, "Failed(%d) to bind UHCI device function: %s.\n", 129 ret, str_error(ret)); 129 130 130 131 /* allow access to hc control registers */ 131 132 regs_t *io; 132 133 ret = pio_enable(regs, reg_size, (void**)&io); 133 CHECK_RET_RETURN(ret, "Failed to gain access to registers at %p.\n", io); 134 CHECK_RET_DEST_FUN_RETURN(ret, "Failed(%d) to gain access to registers at %p: %s.\n", 135 ret, str_error(ret), io); 134 136 instance->registers = io; 135 usb_log_debug("Device registers a ccessible.\n");137 usb_log_debug("Device registers at %p(%u) accessible.\n", io, reg_size); 136 138 137 139 ret = uhci_init_mem_structures(instance); 138 CHECK_RET_ RETURN(ret, "Failed to initializememory structures.\n");140 CHECK_RET_DEST_FUN_RETURN(ret, "Failed to initialize UHCI memory structures.\n"); 139 141 140 142 uhci_init_hw(instance); 141 143 142 144 instance->cleaner = fibril_create(uhci_interrupt_emulator, instance); 143 //fibril_add_ready(instance->cleaner);145 fibril_add_ready(instance->cleaner); 144 146 145 147 instance->debug_checker = fibril_create(uhci_debug_checker, instance); 146 148 fibril_add_ready(instance->debug_checker); 147 149 148 return EOK; 150 usb_log_info("Started UHCI driver.\n"); 151 return EOK; 152 #undef CHECK_RET_DEST_FUN_RETURN 149 153 } 150 154 /*----------------------------------------------------------------------------*/ 151 155 void uhci_init_hw(uhci_t *instance) 152 156 { 157 /* reset everything, who knows what touched it before us */ 158 pio_write_16(&instance->registers->usbcmd, UHCI_CMD_GLOBAL_RESET); 159 async_usleep(10000); /* 10ms according to USB spec */ 160 pio_write_16(&instance->registers->usbcmd, 0); 161 162 /* reset hc, all states and counters */ 163 pio_write_16(&instance->registers->usbcmd, UHCI_CMD_HCRESET); 164 while ((pio_read_16(&instance->registers->usbcmd) & UHCI_CMD_HCRESET) != 0) 165 { async_usleep(10); } 153 166 154 167 /* set framelist pointer */ … … 163 176 pio_write_16(&instance->registers->usbcmd, 164 177 UHCI_CMD_RUN_STOP | UHCI_CMD_MAX_PACKET | UHCI_CMD_CONFIGURE); 165 usb_log_debug("Started UHCI HC.\n");166 178 } 167 179 /*----------------------------------------------------------------------------*/ … … 169 181 { 170 182 assert(instance); 183 #define CHECK_RET_DEST_CMDS_RETURN(ret, message...) \ 184 if (ret != EOK) { \ 185 usb_log_error(message); \ 186 if (instance->interrupt_code.cmds != NULL) \ 187 free(instance->interrupt_code.cmds); \ 188 return ret; \ 189 } else (void) 0 171 190 172 191 /* init interrupt code */ 173 irq_cmd_t *interrupt_commands = malloc(sizeof(uhci_cmds)); 174 if (interrupt_commands == NULL) { 175 return ENOMEM; 176 } 177 memcpy(interrupt_commands, uhci_cmds, sizeof(uhci_cmds)); 178 interrupt_commands[0].addr = (void*)&instance->registers->usbsts; 179 interrupt_commands[1].addr = (void*)&instance->registers->usbsts; 180 instance->interrupt_code.cmds = interrupt_commands; 181 instance->interrupt_code.cmdcount = 182 sizeof(uhci_cmds) / sizeof(irq_cmd_t); 192 instance->interrupt_code.cmds = malloc(sizeof(uhci_cmds)); 193 int ret = (instance->interrupt_code.cmds == NULL) ? ENOMEM : EOK; 194 CHECK_RET_DEST_CMDS_RETURN(ret, "Failed to allocate interrupt cmds space.\n"); 195 196 { 197 irq_cmd_t *interrupt_commands = instance->interrupt_code.cmds; 198 memcpy(interrupt_commands, uhci_cmds, sizeof(uhci_cmds)); 199 interrupt_commands[0].addr = (void*)&instance->registers->usbsts; 200 interrupt_commands[1].addr = (void*)&instance->registers->usbsts; 201 instance->interrupt_code.cmdcount = 202 sizeof(uhci_cmds) / sizeof(irq_cmd_t); 203 } 183 204 184 205 /* init transfer lists */ 185 intret = uhci_init_transfer_lists(instance);186 CHECK_RET_ RETURN(ret, "Failed to initialize transfer lists.\n");206 ret = uhci_init_transfer_lists(instance); 207 CHECK_RET_DEST_CMDS_RETURN(ret, "Failed to initialize transfer lists.\n"); 187 208 usb_log_debug("Initialized transfer lists.\n"); 188 209 … … 190 211 instance->frame_list = get_page(); 191 212 ret = instance ? EOK : ENOMEM; 192 CHECK_RET_ RETURN(ret, "Failed to get frame list page.\n");213 CHECK_RET_DEST_CMDS_RETURN(ret, "Failed to get frame list page.\n"); 193 214 usb_log_debug("Initialized frame list.\n"); 194 215 … … 197 218 instance->transfers_interrupt.queue_head_pa 198 219 | LINK_POINTER_QUEUE_HEAD_FLAG; 220 199 221 unsigned i = 0; 200 222 for(; i < UHCI_FRAME_LIST_COUNT; ++i) { … … 203 225 204 226 /* init address keeper(libusb) */ 205 usb_address_keeping_init(&instance->address_manager, USB11_ADDRESS_MAX); 206 usb_log_debug("Initialized address manager.\n"); 207 208 return EOK; 227 device_keeper_init(&instance->device_manager); 228 usb_log_debug("Initialized device manager.\n"); 229 230 return EOK; 231 #undef CHECK_RET_DEST_CMDS_RETURN 209 232 } 210 233 /*----------------------------------------------------------------------------*/ … … 212 235 { 213 236 assert(instance); 237 #define CHECK_RET_CLEAR_RETURN(ret, message...) \ 238 if (ret != EOK) { \ 239 usb_log_error(message); \ 240 transfer_list_fini(&instance->transfers_bulk_full); \ 241 transfer_list_fini(&instance->transfers_control_full); \ 242 transfer_list_fini(&instance->transfers_control_slow); \ 243 transfer_list_fini(&instance->transfers_interrupt); \ 244 return ret; \ 245 } else (void) 0 214 246 215 247 /* initialize TODO: check errors */ 216 248 int ret; 217 249 ret = transfer_list_init(&instance->transfers_bulk_full, "BULK_FULL"); 218 assert(ret == EOK);250 CHECK_RET_CLEAR_RETURN(ret, "Failed to init BULK list."); 219 251 ret = transfer_list_init(&instance->transfers_control_full, "CONTROL_FULL"); 220 assert(ret == EOK);252 CHECK_RET_CLEAR_RETURN(ret, "Failed to init CONTROL FULL list."); 221 253 ret = transfer_list_init(&instance->transfers_control_slow, "CONTROL_SLOW"); 222 assert(ret == EOK);254 CHECK_RET_CLEAR_RETURN(ret, "Failed to init CONTROL SLOW list."); 223 255 ret = transfer_list_init(&instance->transfers_interrupt, "INTERRUPT"); 224 assert(ret == EOK);256 CHECK_RET_CLEAR_RETURN(ret, "Failed to init INTERRUPT list."); 225 257 226 258 transfer_list_set_next(&instance->transfers_control_full, … … 249 281 250 282 return EOK; 283 #undef CHECK_RET_CLEAR_RETURN 251 284 } 252 285 /*----------------------------------------------------------------------------*/ … … 255 288 assert(instance); 256 289 assert(batch); 257 const int low_speed = (batch->speed == LOW_SPEED);290 const int low_speed = (batch->speed == USB_SPEED_LOW); 258 291 if (!allowed_usb_packet( 259 292 low_speed, batch->transfer_type, batch->max_packet_size)) { … … 276 309 { 277 310 assert(instance); 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);311 // if ((status & (UHCI_STATUS_INTERRUPT | UHCI_STATUS_ERROR_INTERRUPT)) == 0) 312 // return; 313 // usb_log_debug2("UHCI interrupt: %X.\n", status); 314 transfer_list_remove_finished(&instance->transfers_interrupt); 315 transfer_list_remove_finished(&instance->transfers_control_slow); 316 transfer_list_remove_finished(&instance->transfers_control_full); 317 transfer_list_remove_finished(&instance->transfers_bulk_full); 285 318 } 286 319 /*----------------------------------------------------------------------------*/ … … 291 324 assert(instance); 292 325 293 while (1) {326 while (1) { 294 327 uint16_t status = pio_read_16(&instance->registers->usbsts); 328 if (status != 0) 329 usb_log_debug2("UHCI status: %x.\n", status); 330 status |= 1; 295 331 uhci_interrupt(instance, status); 296 async_usleep(UHCI_CLEANER_TIMEOUT); 332 pio_write_16(&instance->registers->usbsts, 0x1f); 333 async_usleep(UHCI_CLEANER_TIMEOUT * 5); 297 334 } 298 335 return EOK; … … 307 344 const uint16_t sts = pio_read_16(&instance->registers->usbsts); 308 345 const uint16_t intr = pio_read_16(&instance->registers->usbintr); 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); 346 if (((cmd & UHCI_CMD_RUN_STOP) != 1) || (sts != 0)) { 347 usb_log_debug2("Command: %X Status: %X Intr: %x\n", 348 cmd, sts, intr); 349 } 350 351 uintptr_t frame_list = 352 pio_read_32(&instance->registers->flbaseadd) & ~0xfff; 313 353 if (frame_list != addr_to_phys(instance->frame_list)) { 314 354 usb_log_debug("Framelist address: %p vs. %p.\n", -
uspace/drv/uhci-hcd/uhci.h
r81c508c rcc44f7e 41 41 #include <ddi.h> 42 42 43 #include <usb/addrkeep.h>44 43 #include <usbhc_iface.h> 45 44 45 #include "batch.h" 46 46 #include "transfer_list.h" 47 #include " batch.h"47 #include "utils/device_keeper.h" 48 48 49 49 typedef struct uhci_regs { … … 82 82 83 83 typedef struct uhci { 84 usb_address_keeping_t address_manager; 84 device_keeper_t device_manager; 85 85 86 volatile regs_t *registers; 86 87 -
uspace/drv/uhci-hcd/uhci_struct/transfer_descriptor.c
r81c508c rcc44f7e 39 39 40 40 void transfer_descriptor_init(transfer_descriptor_t *instance, 41 int error_count, size_t size, bool toggle, bool isochronous, 41 int error_count, size_t size, bool toggle, bool isochronous, bool low_speed, 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) 52 53 | TD_STATUS_ERROR_ACTIVE; 53 54 … … 66 67 } 67 68 68 usb_log_ info("Created TD: %X:%X:%X:%X(%p).\n",69 usb_log_debug2("Created TD: %X:%X:%X:%X(%p).\n", 69 70 instance->next, instance->status, instance->device, 70 71 instance->buffer_ptr, buffer); 71 #if 072 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 #endif83 72 } 84 73 /*----------------------------------------------------------------------------*/ … … 88 77 89 78 if ((instance->status & TD_STATUS_ERROR_STALLED) != 0) 90 return E IO;79 return ESTALL; 91 80 92 81 if ((instance->status & TD_STATUS_ERROR_CRC) != 0) 93 return E AGAIN;82 return EBADCHECKSUM; 94 83 95 84 if ((instance->status & TD_STATUS_ERROR_BUFFER) != 0) -
uspace/drv/uhci-hcd/uhci_struct/transfer_descriptor.h
r81c508c rcc44f7e 92 92 93 93 void transfer_descriptor_init(transfer_descriptor_t *instance, 94 int error_count, size_t size, bool toggle, bool isochronous, 94 int error_count, size_t size, bool toggle, bool isochronous, bool low_speed, 95 95 usb_target_t target, int pid, void *buffer, transfer_descriptor_t * next); 96 96 -
uspace/drv/uhci-rhd/main.c
r81c508c rcc44f7e 33 33 */ 34 34 #include <ddf/driver.h> 35 #include <devman.h> 36 #include <device/hw_res.h> 35 37 #include <usb_iface.h> 36 38 #include <usb/ddfiface.h> … … 43 45 44 46 #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); 45 49 46 50 static int usb_iface_get_hc_handle(ddf_fun_t *fun, devman_handle_t *handle) … … 80 84 } 81 85 82 /* TODO: get register values from hc */ 83 int ret = uhci_root_hub_init(rh, (void*)0xc030, 4, device); 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); 84 95 if (ret != EOK) { 85 96 usb_log_error("Failed(%d) to initialize driver instance.\n", ret); … … 102 113 .driver_ops = &uhci_rh_driver_ops 103 114 }; 104 115 /*----------------------------------------------------------------------------*/ 105 116 int main(int argc, char *argv[]) 106 117 { 107 usb_log_enable(USB_LOG_LEVEL_ INFO, NAME);118 usb_log_enable(USB_LOG_LEVEL_DEBUG, NAME); 108 119 return ddf_driver_main(&uhci_rh_driver); 120 } 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; 109 176 } 110 177 /** -
uspace/drv/uhci-rhd/port.c
r81c508c rcc44f7e 34 34 #include <errno.h> 35 35 #include <str_error.h> 36 #include <fibril_synch.h> 36 37 37 38 #include <usb/usb.h> /* usb_address_t */ … … 45 46 #include "port_status.h" 46 47 47 static int uhci_port_new_device(uhci_port_t *port );48 static int uhci_port_new_device(uhci_port_t *port, uint16_t status); 48 49 static int uhci_port_remove_device(uhci_port_t *port); 49 50 static int uhci_port_set_enabled(uhci_port_t *port, bool enabled); 50 51 static int uhci_port_check(void *port); 52 static int new_device_enable_port(int portno, void *arg); 51 53 52 54 int uhci_port_init( 53 55 uhci_port_t *port, port_status_t *address, unsigned number, 54 unsigned usec, ddf_dev_t *rh , int parent_phone)56 unsigned usec, ddf_dev_t *rh) 55 57 { 56 58 assert(port); … … 69 71 port->checker = fibril_create(uhci_port_check, port); 70 72 if (port->checker == 0) { 71 usb_log_error(": failed to launch root hub fibril."); 73 usb_log_error("Port(%p - %d): failed to launch root hub fibril.", 74 port->address, port->number); 72 75 return ENOMEM; 73 76 } 74 77 fibril_add_ready(port->checker); 75 usb_log_debug( 76 "Added fibril for port %d: %p.\n",number, port->checker);78 usb_log_debug("Port(%p - %d): Added fibril. %x\n", 79 port->address, port->number, port->checker); 77 80 return EOK; 78 81 } … … 90 93 uhci_port_t *port_instance = port; 91 94 assert(port_instance); 95 // port_status_write(port_instance->address, 0); 96 97 unsigned count = 0; 92 98 93 99 while (1) { 100 async_usleep(port_instance->wait_period_usec); 101 94 102 /* read register value */ 95 103 port_status_t port_status = … … 97 105 98 106 /* debug print */ 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) { 107 static fibril_mutex_t dbg_mtx = FIBRIL_MUTEX_INITIALIZER(dbg_mtx); 108 fibril_mutex_lock(&dbg_mtx); 109 usb_log_debug2("Port(%p - %d): Status: %#04x. === %u\n", 110 port_instance->address, port_instance->number, port_status, count++); 111 // print_port_status(port_status); 112 fibril_mutex_unlock(&dbg_mtx); 113 114 if ((port_status & STATUS_CONNECTED_CHANGED) != 0) { 115 usb_log_debug("Port(%p - %d): Connected change detected: %x.\n", 116 port_instance->address, port_instance->number, port_status); 117 118 104 119 int rc = usb_hc_connection_open( 105 120 &port_instance->hc_connection); 106 121 if (rc != EOK) { 107 usb_log_error("Failed to connect to HC."); 108 goto next; 109 } 110 111 if (port_status & STATUS_CONNECTED) { 122 usb_log_error("Port(%p - %d): Failed to connect to HC.", 123 port_instance->address, port_instance->number); 124 continue; 125 } 126 127 /* remove any old device */ 128 if (port_instance->attached_device) { 129 usb_log_debug("Port(%p - %d): Removing device.\n", 130 port_instance->address, port_instance->number); 131 uhci_port_remove_device(port_instance); 132 } 133 134 if ((port_status & STATUS_CONNECTED) != 0) { 112 135 /* new device */ 113 uhci_port_new_device(port_instance );136 uhci_port_new_device(port_instance, port_status); 114 137 } else { 115 uhci_port_remove_device(port_instance); 138 /* ack changes by writing one to WC bits */ 139 port_status_write(port_instance->address, port_status); 140 usb_log_debug("Port(%p - %d): Change status ACK.\n", 141 port_instance->address, port_instance->number); 116 142 } 117 143 … … 119 145 &port_instance->hc_connection); 120 146 if (rc != EOK) { 121 usb_log_error(" Failed to disconnect from HC.");122 goto next;147 usb_log_error("Port(%p - %d): Failed to disconnect from HC.", 148 port_instance->address, port_instance->number); 123 149 } 124 150 } 125 next:126 async_usleep(port_instance->wait_period_usec);127 151 } 128 152 return EOK; … … 139 163 uhci_port_t *port = (uhci_port_t *) arg; 140 164 141 usb_log_debug("new_device_enable_port(%d)\n", port->number); 165 usb_log_debug2("Port(%p - %d): new_device_enable_port.\n", 166 port->address, port->number); 142 167 143 168 /* … … 147 172 async_usleep(100000); 148 173 149 /* Enable the port. */150 uhci_port_set_enabled(port, true);151 174 152 175 /* The hub maintains the reset signal to that port for 10 ms … … 154 177 */ 155 178 { 156 usb_log_debug(" Reset Signal start on port %d.\n",157 port-> number);179 usb_log_debug("Port(%p - %d): Reset Signal start.\n", 180 port->address, port->number); 158 181 port_status_t port_status = 159 182 port_status_read(port->address); … … 165 188 port_status &= ~STATUS_IN_RESET; 166 189 port_status_write(port->address, port_status); 167 usb_log_debug("Reset Signal stop on port %d.\n", 168 port->number); 169 } 170 171 return EOK; 172 } 173 174 /*----------------------------------------------------------------------------*/ 175 static int uhci_port_new_device(uhci_port_t *port) 190 usb_log_debug("Port(%p - %d): Reset Signal stop.\n", 191 port->address, port->number); 192 } 193 194 /* Enable the port. */ 195 uhci_port_set_enabled(port, true); 196 197 return EOK; 198 } 199 200 /*----------------------------------------------------------------------------*/ 201 static int uhci_port_new_device(uhci_port_t *port, uint16_t status) 176 202 { 177 203 assert(port); 178 204 assert(usb_hc_connection_is_opened(&port->hc_connection)); 179 205 180 usb_log_info("Detected new device on port %u.\n", port->number); 206 usb_log_info("Port(%p-%d): Detected new device.\n", 207 port->address, port->number); 181 208 182 209 usb_address_t dev_addr; 183 210 int rc = usb_hc_new_device_wrapper(port->rh, &port->hc_connection, 184 USB_SPEED_FULL,211 ((status & STATUS_LOW_SPEED) != 0) ? USB_SPEED_LOW : USB_SPEED_FULL, 185 212 new_device_enable_port, port->number, port, 186 213 &dev_addr, &port->attached_device, NULL, NULL, NULL); 214 187 215 if (rc != EOK) { 188 usb_log_error(" Failed adding new device on port %u: %s.\n",189 port-> number, str_error(rc));216 usb_log_error("Port(%p-%d): Failed(%d) adding new device: %s.\n", 217 port->address, port->number, rc, str_error(rc)); 190 218 uhci_port_set_enabled(port, false); 191 219 return rc; 192 220 } 193 221 194 usb_log_info(" New device on port %uhas address %d (handle %zu).\n",195 port-> number, dev_addr, port->attached_device);222 usb_log_info("Port(%p-%d): New device has address %d (handle %zu).\n", 223 port->address, port->number, dev_addr, port->attached_device); 196 224 197 225 return EOK; … … 201 229 static int uhci_port_remove_device(uhci_port_t *port) 202 230 { 203 usb_log_error(" Don't know how to remove device %#x.\n",204 (unsigned int)port->attached_device);231 usb_log_error("Port(%p-%d): Don't know how to remove device %#x.\n", 232 port->address, port->number, (unsigned int)port->attached_device); 205 233 // uhci_port_set_enabled(port, false); 206 234 return EOK; … … 223 251 port_status_write(port->address, port_status); 224 252 225 usb_log_info(" %s port %d.\n",226 enabled ? "Enabled" : "Disabled", port->number);253 usb_log_info("Port(%p-%d): %sabled port.\n", 254 port->address, port->number, enabled ? "En" : "Dis"); 227 255 return EOK; 228 256 } -
uspace/drv/uhci-rhd/port.h
r81c508c rcc44f7e 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 , int parent_phone);57 unsigned usec, ddf_dev_t *rh); 58 58 59 59 void uhci_port_fini(uhci_port_t *port); -
uspace/drv/uhci-rhd/port_status.c
r81c508c rcc44f7e 41 41 struct flag_name 42 42 { 43 u nsignedflag;43 uint16_t 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? "YES" : "NO");67 ((value & flags[i].flag) != 0) ? "YES" : "NO"); 68 68 } 69 69 } -
uspace/drv/uhci-rhd/port_status.h
r81c508c rcc44f7e 41 41 typedef uint16_t port_status_t; 42 42 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, 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) 52 51 53 STATUS_LOW_SPEED = 1 << 8, 54 STATUS_IN_RESET = 1 << 9, 55 STATUS_SUSPEND = 1 << 12, 56 }; 52 #define STATUS_LOW_SPEED (1 << 8) 53 #define STATUS_IN_RESET (1 << 9) 54 #define STATUS_SUSPEND (1 << 12) 57 55 58 56 static inline port_status_t port_status_read(port_status_t * address) -
uspace/drv/uhci-rhd/root_hub.c
r81c508c rcc44f7e 40 40 #include "root_hub.h" 41 41 42 43 42 int uhci_root_hub_init( 44 43 uhci_root_hub_t *instance, void *addr, size_t size, ddf_dev_t *rh) … … 47 46 assert(rh); 48 47 int ret; 49 ret = usb_hc_find(rh->handle, &instance->hc_handle);50 usb_log_info("rh found(%d) hc handle: %d.\n", ret, instance->hc_handle);51 if (ret != EOK) {52 return ret;53 }54 48 55 49 /* allow access to root hub registers */ 56 50 assert(sizeof(port_status_t) * UHCI_ROOT_HUB_PORT_COUNT == size); 57 51 port_status_t *regs; 58 ret = pio_enable( 59 addr, sizeof(port_status_t) * UHCI_ROOT_HUB_PORT_COUNT, (void**)®s); 52 ret = pio_enable(addr, size, (void**)®s); 60 53 61 54 if (ret < 0) { … … 67 60 unsigned i = 0; 68 61 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 }76 62 /* mind pointer arithmetics */ 77 intret = uhci_port_init(78 &instance->ports[i], regs + i, i, ROOT_HUB_WAIT_USEC, rh , parent_phone);63 ret = uhci_port_init( 64 &instance->ports[i], regs + i, i, ROOT_HUB_WAIT_USEC, rh); 79 65 if (ret != EOK) { 80 66 unsigned j = 0; -
uspace/drv/uhci-rhd/root_hub.h
r81c508c rcc44f7e 41 41 42 42 #define UHCI_ROOT_HUB_PORT_COUNT 2 43 #define UHCI_ROOT_HUB_PORT_REGISTERS_OFFSET 0x10 44 #define ROOT_HUB_WAIT_USEC 10000000 /* 10 seconds */ 43 #define ROOT_HUB_WAIT_USEC 5000000 /* 5 seconds */ 45 44 46 45 typedef struct root_hub {
Note:
See TracChangeset
for help on using the changeset viewer.