Changeset e099f26 in mainline for uspace/drv/uhci-hcd
- Timestamp:
- 2011-03-21T20:22:50Z (15 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- c56c5b5b
- Parents:
- 4fb6d9ee (diff), 31b568e (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/drv/uhci-hcd
- Files:
-
- 10 edited
-
Makefile (modified) (1 diff)
-
batch.c (modified) (24 diffs)
-
batch.h (modified) (2 diffs)
-
iface.c (modified) (13 diffs)
-
main.c (modified) (3 diffs)
-
transfer_list.c (modified) (10 diffs)
-
transfer_list.h (modified) (1 diff)
-
uhci.c (modified) (2 diffs)
-
uhci_hc.c (modified) (4 diffs)
-
uhci_hc.h (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/uhci-hcd/Makefile
r4fb6d9ee re099f26 40 40 uhci_rh.c \ 41 41 uhci_struct/transfer_descriptor.c \ 42 utils/device_keeper.c \43 42 pci.c \ 44 43 batch.c -
uspace/drv/uhci-hcd/batch.c
r4fb6d9ee re099f26 42 42 #include "uhci_hc.h" 43 43 #include "utils/malloc32.h" 44 #include "uhci_struct/transfer_descriptor.h" 44 45 45 46 #define DEFAULT_ERROR_COUNT 3 46 47 47 static void batch_control(batch_t *instance, 48 typedef struct uhci_batch { 49 qh_t *qh; 50 td_t *tds; 51 size_t packets; 52 usb_device_keeper_t *manager; 53 } uhci_batch_t; 54 55 static void batch_control(usb_transfer_batch_t *instance, 48 56 usb_packet_id data_stage, usb_packet_id status_stage); 49 static void batch_data(batch_t *instance, usb_packet_id pid); 50 static void batch_call_in(batch_t *instance); 51 static void batch_call_out(batch_t *instance); 52 static void batch_call_in_and_dispose(batch_t *instance); 53 static void batch_call_out_and_dispose(batch_t *instance); 57 static void batch_data(usb_transfer_batch_t *instance, usb_packet_id pid); 58 static void batch_call_in_and_dispose(usb_transfer_batch_t *instance); 59 static void batch_call_out_and_dispose(usb_transfer_batch_t *instance); 54 60 55 61 … … 76 82 * transaction and callback. 77 83 */ 78 batch_t * batch_get(ddf_fun_t *fun, usb_target_t target,84 usb_transfer_batch_t * batch_get(ddf_fun_t *fun, usb_target_t target, 79 85 usb_transfer_type_t transfer_type, size_t max_packet_size, 80 usb_speed_t speed, char *buffer, size_t size,86 usb_speed_t speed, char *buffer, size_t buffer_size, 81 87 char* setup_buffer, size_t setup_size, 82 88 usbhc_iface_transfer_in_callback_t func_in, 83 89 usbhc_iface_transfer_out_callback_t func_out, void *arg, 84 device_keeper_t *manager90 usb_device_keeper_t *manager 85 91 ) 86 92 { … … 97 103 } else (void)0 98 104 99 batch_t *instance = malloc(sizeof(batch_t));105 usb_transfer_batch_t *instance = malloc(sizeof(usb_transfer_batch_t)); 100 106 CHECK_NULL_DISPOSE_RETURN(instance, 101 107 "Failed to allocate batch instance.\n"); 102 bzero(instance, sizeof(batch_t)); 103 104 instance->qh = malloc32(sizeof(qh_t)); 105 CHECK_NULL_DISPOSE_RETURN(instance->qh, 108 usb_transfer_batch_init(instance, target, transfer_type, speed, max_packet_size, 109 buffer, NULL, buffer_size, NULL, setup_size, func_in, 110 func_out, arg, fun, NULL); 111 112 113 uhci_batch_t *data = malloc(sizeof(uhci_batch_t)); 114 CHECK_NULL_DISPOSE_RETURN(instance, 115 "Failed to allocate batch instance.\n"); 116 bzero(data, sizeof(uhci_batch_t)); 117 data->manager = manager; 118 instance->private_data = data; 119 120 data->packets = (buffer_size + max_packet_size - 1) / max_packet_size; 121 if (transfer_type == USB_TRANSFER_CONTROL) { 122 data->packets += 2; 123 } 124 125 data->tds = malloc32(sizeof(td_t) * data->packets); 126 CHECK_NULL_DISPOSE_RETURN( 127 data->tds, "Failed to allocate transfer descriptors.\n"); 128 bzero(data->tds, sizeof(td_t) * data->packets); 129 130 data->qh = malloc32(sizeof(qh_t)); 131 CHECK_NULL_DISPOSE_RETURN(data->qh, 106 132 "Failed to allocate batch queue head.\n"); 107 qh_init(instance->qh); 108 109 instance->packets = (size + max_packet_size - 1) / max_packet_size; 110 if (transfer_type == USB_TRANSFER_CONTROL) { 111 instance->packets += 2; 112 } 113 114 instance->tds = malloc32(sizeof(td_t) * instance->packets); 115 CHECK_NULL_DISPOSE_RETURN( 116 instance->tds, "Failed to allocate transfer descriptors.\n"); 117 bzero(instance->tds, sizeof(td_t) * instance->packets); 118 119 if (size > 0) { 120 instance->transport_buffer = malloc32(size); 133 qh_init(data->qh); 134 qh_set_element_td(data->qh, addr_to_phys(data->tds)); 135 136 if (buffer_size > 0) { 137 instance->transport_buffer = malloc32(buffer_size); 121 138 CHECK_NULL_DISPOSE_RETURN(instance->transport_buffer, 122 139 "Failed to allocate device accessible buffer.\n"); … … 130 147 } 131 148 132 133 link_initialize(&instance->link);134 135 instance->max_packet_size = max_packet_size;136 instance->target = target;137 instance->transfer_type = transfer_type;138 instance->buffer = buffer;139 instance->buffer_size = size;140 instance->setup_size = setup_size;141 instance->fun = fun;142 instance->arg = arg;143 instance->speed = speed;144 instance->manager = manager;145 instance->callback_out = func_out;146 instance->callback_in = func_in;147 148 qh_set_element_td(instance->qh, addr_to_phys(instance->tds));149 150 149 usb_log_debug("Batch(%p) %d:%d memory structures ready.\n", 151 150 instance, target.address, target.endpoint); … … 153 152 } 154 153 /*----------------------------------------------------------------------------*/ 155 /** Mark batch as failed and continue with next step.156 *157 * @param[in] instance Batch structure to use.158 *159 */160 void batch_abort(batch_t *instance)161 {162 assert(instance);163 instance->error = EIO;164 instance->next_step(instance);165 }166 /*----------------------------------------------------------------------------*/167 154 /** Check batch TDs for activity. 168 155 * … … 174 161 * is reached. 175 162 */ 176 bool batch_is_complete(batch_t *instance) 177 { 178 assert(instance); 163 bool batch_is_complete(usb_transfer_batch_t *instance) 164 { 165 assert(instance); 166 uhci_batch_t *data = instance->private_data; 167 assert(data); 168 179 169 usb_log_debug2("Batch(%p) checking %d packet(s) for completion.\n", 180 instance, instance->packets);170 instance, data->packets); 181 171 instance->transfered_size = 0; 182 172 size_t i = 0; 183 for (;i < instance->packets; ++i) {184 if (td_is_active(& instance->tds[i])) {173 for (;i < data->packets; ++i) { 174 if (td_is_active(&data->tds[i])) { 185 175 return false; 186 176 } 187 177 188 instance->error = td_status(& instance->tds[i]);178 instance->error = td_status(&data->tds[i]); 189 179 if (instance->error != EOK) { 190 180 usb_log_debug("Batch(%p) found error TD(%d):%x.\n", 191 instance, i, instance->tds[i].status); 192 td_print_status(&instance->tds[i]); 193 194 device_keeper_set_toggle(instance->manager, 195 instance->target, td_toggle(&instance->tds[i])); 181 instance, i, data->tds[i].status); 182 td_print_status(&data->tds[i]); 183 184 usb_device_keeper_set_toggle(data->manager, 185 instance->target, instance->direction, 186 td_toggle(&data->tds[i])); 196 187 if (i > 0) 197 188 goto substract_ret; … … 199 190 } 200 191 201 instance->transfered_size += td_act_size(& instance->tds[i]);202 if (td_is_short(& instance->tds[i]))192 instance->transfered_size += td_act_size(&data->tds[i]); 193 if (td_is_short(&data->tds[i])) 203 194 goto substract_ret; 204 195 } … … 214 205 * Uses genercir control function with pids OUT and IN. 215 206 */ 216 void batch_control_write( batch_t *instance)207 void batch_control_write(usb_transfer_batch_t *instance) 217 208 { 218 209 assert(instance); … … 231 222 * Uses generic control with pids IN and OUT. 232 223 */ 233 void batch_control_read( batch_t *instance)224 void batch_control_read(usb_transfer_batch_t *instance) 234 225 { 235 226 assert(instance); … … 245 236 * Data transaction with PID_IN. 246 237 */ 247 void batch_interrupt_in(batch_t *instance) 248 { 249 assert(instance); 238 void batch_interrupt_in(usb_transfer_batch_t *instance) 239 { 240 assert(instance); 241 instance->direction = USB_DIRECTION_IN; 250 242 batch_data(instance, USB_PID_IN); 251 243 instance->next_step = batch_call_in_and_dispose; … … 259 251 * Data transaction with PID_OUT. 260 252 */ 261 void batch_interrupt_out(batch_t *instance) 262 { 263 assert(instance); 253 void batch_interrupt_out(usb_transfer_batch_t *instance) 254 { 255 assert(instance); 256 instance->direction = USB_DIRECTION_OUT; 264 257 /* We are data out, we are supposed to provide data */ 265 258 memcpy(instance->transport_buffer, instance->buffer, … … 276 269 * Data transaction with PID_IN. 277 270 */ 278 void batch_bulk_in( batch_t *instance)271 void batch_bulk_in(usb_transfer_batch_t *instance) 279 272 { 280 273 assert(instance); 281 274 batch_data(instance, USB_PID_IN); 275 instance->direction = USB_DIRECTION_IN; 282 276 instance->next_step = batch_call_in_and_dispose; 283 277 usb_log_debug("Batch(%p) BULK IN initialized.\n", instance); … … 290 284 * Data transaction with PID_OUT. 291 285 */ 292 void batch_bulk_out(batch_t *instance) 293 { 294 assert(instance); 286 void batch_bulk_out(usb_transfer_batch_t *instance) 287 { 288 assert(instance); 289 instance->direction = USB_DIRECTION_OUT; 295 290 /* We are data out, we are supposed to provide data */ 296 291 memcpy(instance->transport_buffer, instance->buffer, … … 309 304 * The last packet is marked with IOC flag. 310 305 */ 311 void batch_data(batch_t *instance, usb_packet_id pid) 312 { 313 assert(instance); 306 void batch_data(usb_transfer_batch_t *instance, usb_packet_id pid) 307 { 308 assert(instance); 309 uhci_batch_t *data = instance->private_data; 310 assert(data); 311 314 312 const bool low_speed = instance->speed == USB_SPEED_LOW; 315 int toggle = 316 d evice_keeper_get_toggle(instance->manager, instance->target);313 int toggle = usb_device_keeper_get_toggle( 314 data->manager, instance->target, instance->direction); 317 315 assert(toggle == 0 || toggle == 1); 318 316 … … 320 318 size_t remain_size = instance->buffer_size; 321 319 while (remain_size > 0) { 322 char * data =320 char *trans_data = 323 321 instance->transport_buffer + instance->buffer_size 324 322 - remain_size; … … 328 326 remain_size : instance->max_packet_size; 329 327 330 td_t *next_packet = (packet + 1 < instance->packets)331 ? & instance->tds[packet + 1] : NULL;332 333 assert(packet < instance->packets);328 td_t *next_packet = (packet + 1 < data->packets) 329 ? &data->tds[packet + 1] : NULL; 330 331 assert(packet < data->packets); 334 332 assert(packet_size <= remain_size); 335 333 336 334 td_init( 337 & instance->tds[packet], DEFAULT_ERROR_COUNT, packet_size,338 toggle, false, low_speed, instance->target, pid, data,335 &data->tds[packet], DEFAULT_ERROR_COUNT, packet_size, 336 toggle, false, low_speed, instance->target, pid, trans_data, 339 337 next_packet); 340 338 … … 344 342 ++packet; 345 343 } 346 td_set_ioc(&instance->tds[packet - 1]); 347 device_keeper_set_toggle(instance->manager, instance->target, toggle); 344 td_set_ioc(&data->tds[packet - 1]); 345 usb_device_keeper_set_toggle(data->manager, instance->target, 346 instance->direction, toggle); 348 347 } 349 348 /*----------------------------------------------------------------------------*/ … … 359 358 * The last packet is marked with IOC. 360 359 */ 361 void batch_control( batch_t *instance,360 void batch_control(usb_transfer_batch_t *instance, 362 361 usb_packet_id data_stage, usb_packet_id status_stage) 363 362 { 364 363 assert(instance); 364 uhci_batch_t *data = instance->private_data; 365 assert(data); 366 assert(data->packets >= 2); 365 367 366 368 const bool low_speed = instance->speed == USB_SPEED_LOW; 367 369 int toggle = 0; 368 370 /* setup stage */ 369 td_init(instance->tds, DEFAULT_ERROR_COUNT, 370 instance->setup_size, toggle, false, low_speed, instance->target, 371 USB_PID_SETUP, instance->setup_buffer, &instance->tds[1]); 371 td_init( 372 data->tds, DEFAULT_ERROR_COUNT, instance->setup_size, toggle, false, 373 low_speed, instance->target, USB_PID_SETUP, instance->setup_buffer, 374 &data->tds[1]); 372 375 373 376 /* data stage */ … … 375 378 size_t remain_size = instance->buffer_size; 376 379 while (remain_size > 0) { 377 char * data =380 char *control_data = 378 381 instance->transport_buffer + instance->buffer_size 379 382 - remain_size; … … 386 389 387 390 td_init( 388 & instance->tds[packet], DEFAULT_ERROR_COUNT, packet_size,391 &data->tds[packet], DEFAULT_ERROR_COUNT, packet_size, 389 392 toggle, false, low_speed, instance->target, data_stage, 390 data, &instance->tds[packet + 1]);393 control_data, &data->tds[packet + 1]); 391 394 392 395 ++packet; 393 assert(packet < instance->packets);396 assert(packet < data->packets); 394 397 assert(packet_size <= remain_size); 395 398 remain_size -= packet_size; … … 397 400 398 401 /* status stage */ 399 assert(packet == instance->packets - 1); 400 td_init(&instance->tds[packet], DEFAULT_ERROR_COUNT, 401 0, 1, false, low_speed, instance->target, status_stage, NULL, NULL); 402 403 td_set_ioc(&instance->tds[packet]); 402 assert(packet == data->packets - 1); 403 404 td_init( 405 &data->tds[packet], DEFAULT_ERROR_COUNT, 0, 1, false, low_speed, 406 instance->target, status_stage, NULL, NULL); 407 td_set_ioc(&data->tds[packet]); 408 404 409 usb_log_debug2("Control last TD status: %x.\n", 405 instance->tds[packet].status); 406 } 407 /*----------------------------------------------------------------------------*/ 408 /** Prepare data, get error status and call callback in. 409 * 410 * @param[in] instance Batch structure to use. 411 * Copies data from transport buffer, and calls callback with appropriate 412 * parameters. 413 */ 414 void batch_call_in(batch_t *instance) 415 { 416 assert(instance); 417 assert(instance->callback_in); 418 419 /* We are data in, we need data */ 420 memcpy(instance->buffer, instance->transport_buffer, 421 instance->buffer_size); 422 423 int err = instance->error; 424 usb_log_debug("Batch(%p) callback IN(type:%d): %s(%d), %zu.\n", 425 instance, instance->transfer_type, str_error(err), err, 426 instance->transfered_size); 427 428 instance->callback_in( 429 instance->fun, err, instance->transfered_size, instance->arg); 430 } 431 /*----------------------------------------------------------------------------*/ 432 /** Get error status and call callback out. 433 * 434 * @param[in] instance Batch structure to use. 435 */ 436 void batch_call_out(batch_t *instance) 437 { 438 assert(instance); 439 assert(instance->callback_out); 440 441 int err = instance->error; 442 usb_log_debug("Batch(%p) callback OUT(type:%d): %s(%d).\n", 443 instance, instance->transfer_type, str_error(err), err); 444 instance->callback_out(instance->fun, 445 err, instance->arg); 410 data->tds[packet].status); 411 } 412 /*----------------------------------------------------------------------------*/ 413 qh_t * batch_qh(usb_transfer_batch_t *instance) 414 { 415 assert(instance); 416 uhci_batch_t *data = instance->private_data; 417 assert(data); 418 return data->qh; 446 419 } 447 420 /*----------------------------------------------------------------------------*/ … … 450 423 * @param[in] instance Batch structure to use. 451 424 */ 452 void batch_call_in_and_dispose( batch_t *instance)453 { 454 assert(instance); 455 batch_call_in(instance);425 void batch_call_in_and_dispose(usb_transfer_batch_t *instance) 426 { 427 assert(instance); 428 usb_transfer_batch_call_in(instance); 456 429 batch_dispose(instance); 457 430 } … … 461 434 * @param[in] instance Batch structure to use. 462 435 */ 463 void batch_call_out_and_dispose( batch_t *instance)464 { 465 assert(instance); 466 batch_call_out(instance);436 void batch_call_out_and_dispose(usb_transfer_batch_t *instance) 437 { 438 assert(instance); 439 usb_transfer_batch_call_out(instance); 467 440 batch_dispose(instance); 468 441 } … … 472 445 * @param[in] instance Batch structure to use. 473 446 */ 474 void batch_dispose(batch_t *instance) 475 { 476 assert(instance); 447 void batch_dispose(usb_transfer_batch_t *instance) 448 { 449 assert(instance); 450 uhci_batch_t *data = instance->private_data; 451 assert(data); 477 452 usb_log_debug("Batch(%p) disposing.\n", instance); 478 453 /* free32 is NULL safe */ 479 free32( instance->tds);480 free32( instance->qh);454 free32(data->tds); 455 free32(data->qh); 481 456 free32(instance->setup_buffer); 482 457 free32(instance->transport_buffer); 458 free(data); 483 459 free(instance); 484 460 } -
uspace/drv/uhci-hcd/batch.h
r4fb6d9ee re099f26 39 39 #include <usbhc_iface.h> 40 40 #include <usb/usb.h> 41 #include <usb/host/device_keeper.h> 42 #include <usb/host/batch.h> 41 43 42 #include "uhci_struct/transfer_descriptor.h"43 44 #include "uhci_struct/queue_head.h" 44 #include "utils/device_keeper.h"45 45 46 typedef struct batch 47 { 48 link_t link; 49 usb_speed_t speed; 50 usb_target_t target; 51 usb_transfer_type_t transfer_type; 52 usbhc_iface_transfer_in_callback_t callback_in; 53 usbhc_iface_transfer_out_callback_t callback_out; 54 void *arg; 55 char *transport_buffer; 56 char *setup_buffer; 57 size_t setup_size; 58 char *buffer; 59 size_t buffer_size; 60 size_t max_packet_size; 61 size_t packets; 62 size_t transfered_size; 63 int error; 64 ddf_fun_t *fun; 65 qh_t *qh; 66 td_t *tds; 67 void (*next_step)(struct batch*); 68 device_keeper_t *manager; 69 } batch_t; 70 71 batch_t * batch_get( 46 usb_transfer_batch_t * batch_get( 72 47 ddf_fun_t *fun, 73 48 usb_target_t target, … … 82 57 usbhc_iface_transfer_out_callback_t func_out, 83 58 void *arg, 84 device_keeper_t *manager59 usb_device_keeper_t *manager 85 60 ); 86 61 87 void batch_dispose( batch_t *instance);62 void batch_dispose(usb_transfer_batch_t *instance); 88 63 89 void batch_abort(batch_t *instance);64 bool batch_is_complete(usb_transfer_batch_t *instance); 90 65 91 bool batch_is_complete(batch_t *instance);66 void batch_control_write(usb_transfer_batch_t *instance); 92 67 93 void batch_control_ write(batch_t *instance);68 void batch_control_read(usb_transfer_batch_t *instance); 94 69 95 void batch_ control_read(batch_t *instance);70 void batch_interrupt_in(usb_transfer_batch_t *instance); 96 71 97 void batch_interrupt_ in(batch_t *instance);72 void batch_interrupt_out(usb_transfer_batch_t *instance); 98 73 99 void batch_ interrupt_out(batch_t *instance);74 void batch_bulk_in(usb_transfer_batch_t *instance); 100 75 101 void batch_bulk_ in(batch_t *instance);76 void batch_bulk_out(usb_transfer_batch_t *instance); 102 77 103 void batch_bulk_out(batch_t *instance);78 qh_t * batch_qh(usb_transfer_batch_t *instance); 104 79 #endif 105 80 /** -
uspace/drv/uhci-hcd/iface.c
r4fb6d9ee re099f26 41 41 #include "iface.h" 42 42 #include "uhci_hc.h" 43 #include "utils/device_keeper.h"44 43 45 44 /** Reserve default address interface function … … 56 55 assert(hc); 57 56 usb_log_debug("Default address request with speed %d.\n", speed); 58 device_keeper_reserve_default(&hc->device_manager, speed);57 usb_device_keeper_reserve_default_address(&hc->device_manager, speed); 59 58 return EOK; 60 59 } … … 71 70 assert(hc); 72 71 usb_log_debug("Default address release.\n"); 73 device_keeper_release_default(&hc->device_manager);72 usb_device_keeper_release_default_address(&hc->device_manager); 74 73 return EOK; 75 74 } … … 91 90 92 91 usb_log_debug("Address request with speed %d.\n", speed); 93 *address = device_keeper_ request(&hc->device_manager, speed);92 *address = device_keeper_get_free_address(&hc->device_manager, speed); 94 93 usb_log_debug("Address request with result: %d.\n", *address); 95 94 if (*address <= 0) … … 112 111 assert(hc); 113 112 usb_log_debug("Address bind %d-%d.\n", address, handle); 114 device_keeper_bind(&hc->device_manager, address, handle);113 usb_device_keeper_bind(&hc->device_manager, address, handle); 115 114 return EOK; 116 115 } … … 128 127 assert(hc); 129 128 usb_log_debug("Address release %d.\n", address); 130 device_keeper_release(&hc->device_manager, address);129 usb_device_keeper_release(&hc->device_manager, address); 131 130 return EOK; 132 131 } … … 150 149 uhci_hc_t *hc = fun_to_uhci_hc(fun); 151 150 assert(hc); 152 usb_speed_t speed = device_keeper_speed(&hc->device_manager, target.address);151 usb_speed_t speed = usb_device_keeper_get_speed(&hc->device_manager, target.address); 153 152 154 153 usb_log_debug("Interrupt OUT %d:%d %zu(%zu).\n", 155 154 target.address, target.endpoint, size, max_packet_size); 156 155 157 batch_t *batch = batch_get(fun, target, USB_TRANSFER_INTERRUPT,156 usb_transfer_batch_t *batch = batch_get(fun, target, USB_TRANSFER_INTERRUPT, 158 157 max_packet_size, speed, data, size, NULL, 0, NULL, callback, arg, 159 158 &hc->device_manager); … … 187 186 uhci_hc_t *hc = fun_to_uhci_hc(fun); 188 187 assert(hc); 189 usb_speed_t speed = device_keeper_speed(&hc->device_manager, target.address);188 usb_speed_t speed = usb_device_keeper_get_speed(&hc->device_manager, target.address); 190 189 usb_log_debug("Interrupt IN %d:%d %zu(%zu).\n", 191 190 target.address, target.endpoint, size, max_packet_size); 192 191 193 batch_t *batch = batch_get(fun, target, USB_TRANSFER_INTERRUPT,192 usb_transfer_batch_t *batch = batch_get(fun, target, USB_TRANSFER_INTERRUPT, 194 193 max_packet_size, speed, data, size, NULL, 0, callback, NULL, arg, 195 194 &hc->device_manager); … … 223 222 uhci_hc_t *hc = fun_to_uhci_hc(fun); 224 223 assert(hc); 225 usb_speed_t speed = device_keeper_speed(&hc->device_manager, target.address);224 usb_speed_t speed = usb_device_keeper_get_speed(&hc->device_manager, target.address); 226 225 227 226 usb_log_debug("Bulk OUT %d:%d %zu(%zu).\n", 228 227 target.address, target.endpoint, size, max_packet_size); 229 228 230 batch_t *batch = batch_get(fun, target, USB_TRANSFER_BULK,229 usb_transfer_batch_t *batch = batch_get(fun, target, USB_TRANSFER_BULK, 231 230 max_packet_size, speed, data, size, NULL, 0, NULL, callback, arg, 232 231 &hc->device_manager); … … 260 259 uhci_hc_t *hc = fun_to_uhci_hc(fun); 261 260 assert(hc); 262 usb_speed_t speed = device_keeper_speed(&hc->device_manager, target.address);261 usb_speed_t speed = usb_device_keeper_get_speed(&hc->device_manager, target.address); 263 262 usb_log_debug("Bulk IN %d:%d %zu(%zu).\n", 264 263 target.address, target.endpoint, size, max_packet_size); 265 264 266 batch_t *batch = batch_get(fun, target, USB_TRANSFER_BULK,265 usb_transfer_batch_t *batch = batch_get(fun, target, USB_TRANSFER_BULK, 267 266 max_packet_size, speed, data, size, NULL, 0, callback, NULL, arg, 268 267 &hc->device_manager); … … 299 298 uhci_hc_t *hc = fun_to_uhci_hc(fun); 300 299 assert(hc); 301 usb_speed_t speed = device_keeper_speed(&hc->device_manager, target.address);300 usb_speed_t speed = usb_device_keeper_get_speed(&hc->device_manager, target.address); 302 301 usb_log_debug("Control WRITE (%d) %d:%d %zu(%zu).\n", 303 302 speed, target.address, target.endpoint, size, max_packet_size); … … 306 305 return EINVAL; 307 306 308 batch_t *batch = batch_get(fun, target, USB_TRANSFER_CONTROL,307 usb_transfer_batch_t *batch = batch_get(fun, target, USB_TRANSFER_CONTROL, 309 308 max_packet_size, speed, data, size, setup_data, setup_size, 310 309 NULL, callback, arg, &hc->device_manager); 311 310 if (!batch) 312 311 return ENOMEM; 313 device_keeper_reset_if_need(&hc->device_manager, target, setup_data);312 usb_device_keeper_reset_if_need(&hc->device_manager, target, setup_data); 314 313 batch_control_write(batch); 315 314 const int ret = uhci_hc_schedule(hc, batch); … … 342 341 uhci_hc_t *hc = fun_to_uhci_hc(fun); 343 342 assert(hc); 344 usb_speed_t speed = device_keeper_speed(&hc->device_manager, target.address);343 usb_speed_t speed = usb_device_keeper_get_speed(&hc->device_manager, target.address); 345 344 346 345 usb_log_debug("Control READ(%d) %d:%d %zu(%zu).\n", 347 346 speed, target.address, target.endpoint, size, max_packet_size); 348 batch_t *batch = batch_get(fun, target, USB_TRANSFER_CONTROL,347 usb_transfer_batch_t *batch = batch_get(fun, target, USB_TRANSFER_CONTROL, 349 348 max_packet_size, speed, data, size, setup_data, setup_size, callback, 350 349 NULL, arg, &hc->device_manager); -
uspace/drv/uhci-hcd/main.c
r4fb6d9ee re099f26 62 62 int uhci_add_device(ddf_dev_t *device) 63 63 { 64 usb_log_ info("uhci_add_device() called\n");64 usb_log_debug("uhci_add_device() called\n"); 65 65 assert(device); 66 66 uhci_t *uhci = malloc(sizeof(uhci_t)); … … 72 72 int ret = uhci_init(uhci, device); 73 73 if (ret != EOK) { 74 usb_log_error("Failed to initialzie UHCI driver.\n"); 74 usb_log_error("Failed to initialize UHCI driver: %s.\n", 75 str_error(ret)); 75 76 return ret; 76 77 } 77 78 device->driver_data = uhci; 79 80 usb_log_info("Controlling new UHCI device `%s'.\n", device->name); 81 78 82 return EOK; 79 83 } … … 89 93 int main(int argc, char *argv[]) 90 94 { 95 printf(NAME ": HelenOS UHCI driver.\n"); 96 91 97 sleep(3); /* TODO: remove in final version */ 92 usb_log_enable(USB_LOG_LEVEL_DE BUG, NAME);98 usb_log_enable(USB_LOG_LEVEL_DEFAULT, NAME); 93 99 94 100 return ddf_driver_main(&uhci_driver); -
uspace/drv/uhci-hcd/transfer_list.c
r4fb6d9ee re099f26 38 38 39 39 static void transfer_list_remove_batch( 40 transfer_list_t *instance, batch_t *batch);40 transfer_list_t *instance, usb_transfer_batch_t *batch); 41 41 /*----------------------------------------------------------------------------*/ 42 42 /** Initialize transfer list structures. … … 91 91 * The batch is added to the end of the list and queue. 92 92 */ 93 void transfer_list_add_batch(transfer_list_t *instance, batch_t *batch)93 void transfer_list_add_batch(transfer_list_t *instance, usb_transfer_batch_t *batch) 94 94 { 95 95 assert(instance); 96 96 assert(batch); 97 97 usb_log_debug2("Queue %s: Adding batch(%p).\n", instance->name, batch); 98 99 98 100 99 fibril_mutex_lock(&instance->guard); … … 107 106 } else { 108 107 /* There is something scheduled */ 109 batch_t *last = list_get_instance(110 instance->batch_list.prev, batch_t, link);111 last_qh = last->qh;108 usb_transfer_batch_t *last = list_get_instance( 109 instance->batch_list.prev, usb_transfer_batch_t, link); 110 last_qh = batch_qh(last); 112 111 } 113 112 const uint32_t pa = addr_to_phys(batch->qh); 114 113 assert((pa & LINK_POINTER_ADDRESS_MASK) == pa); 115 114 116 batch->qh->next = last_qh->next; 115 /* keep link */ 116 batch_qh(batch)->next = last_qh->next; 117 117 qh_set_next_qh(last_qh, pa); 118 118 … … 120 120 list_append(&batch->link, &instance->batch_list); 121 121 122 batch_t *first = list_get_instance(123 instance->batch_list.next, batch_t, link);122 usb_transfer_batch_t *first = list_get_instance( 123 instance->batch_list.next, usb_transfer_batch_t, link); 124 124 usb_log_debug("Batch(%p) added to queue %s, first is %p.\n", 125 125 batch, instance->name, first); … … 146 146 while (current != &instance->batch_list) { 147 147 link_t *next = current->next; 148 batch_t *batch = list_get_instance(current,batch_t, link);148 usb_transfer_batch_t *batch = list_get_instance(current, usb_transfer_batch_t, link); 149 149 150 150 if (batch_is_complete(batch)) { … … 160 160 link_t *item = done.next; 161 161 list_remove(item); 162 batch_t *batch = list_get_instance(item,batch_t, link);162 usb_transfer_batch_t *batch = list_get_instance(item, usb_transfer_batch_t, link); 163 163 batch->next_step(batch); 164 164 } … … 174 174 while (!list_empty(&instance->batch_list)) { 175 175 link_t *current = instance->batch_list.next; 176 batch_t *batch = list_get_instance(current,batch_t, link);176 usb_transfer_batch_t *batch = list_get_instance(current, usb_transfer_batch_t, link); 177 177 transfer_list_remove_batch(instance, batch); 178 batch_abort(batch);178 usb_transfer_batch_finish(batch, EIO); 179 179 } 180 180 fibril_mutex_unlock(&instance->guard); … … 189 189 * Does not lock the transfer list, caller is responsible for that. 190 190 */ 191 void transfer_list_remove_batch(transfer_list_t *instance, batch_t *batch) 192 { 193 assert(instance); 191 void transfer_list_remove_batch(transfer_list_t *instance, usb_transfer_batch_t *batch) 192 { 193 assert(instance); 194 assert(instance->queue_head); 194 195 assert(batch); 195 assert(instance->queue_head); 196 assert(batch->qh); 196 assert(batch_qh(batch)); 197 197 assert(fibril_mutex_is_locked(&instance->guard)); 198 198 … … 205 205 /* I'm the first one here */ 206 206 assert((instance->queue_head->next & LINK_POINTER_ADDRESS_MASK) 207 == addr_to_phys(bat ch->qh));208 instance->queue_head->next = batch ->qh->next;207 == addr_to_phys(bathc_qh(batch))); 208 instance->queue_head->next = batch_qh(batch)->next; 209 209 qpos = "FIRST"; 210 210 } else { 211 batch_t *prev =212 list_get_instance(batch->link.prev, batch_t, link);213 assert(( prev->qh->next & LINK_POINTER_ADDRESS_MASK)214 == addr_to_phys(batch ->qh));215 prev->qh->next = batch->qh->next;211 usb_transfer_batch_t *prev = 212 list_get_instance(batch->link.prev, usb_transfer_batch_t, link); 213 assert((batch_qh(prev)->next & LINK_POINTER_ADDRESS_MASK) 214 == addr_to_phys(batch_qh(batch))); 215 batch_qh(prev)->next = batch_qh(batch)->next; 216 216 qpos = "NOT FIRST"; 217 217 } … … 219 219 list_remove(&batch->link); 220 220 usb_log_debug("Batch(%p) removed (%s) from %s, next %x.\n", 221 batch, qpos, instance->name, batch->qh->next);221 batch, pos, instance->name, batch_qh(batch)->next); 222 222 } 223 223 /** -
uspace/drv/uhci-hcd/transfer_list.h
r4fb6d9ee re099f26 66 66 void transfer_list_set_next(transfer_list_t *instance, transfer_list_t *next); 67 67 68 void transfer_list_add_batch(transfer_list_t *instance, batch_t *batch);68 void transfer_list_add_batch(transfer_list_t *instance, usb_transfer_batch_t *batch); 69 69 70 70 void transfer_list_remove_finished(transfer_list_t *instance); -
uspace/drv/uhci-hcd/uhci.c
r4fb6d9ee re099f26 70 70 { 71 71 assert(fun); 72 device_keeper_t *manager = &((uhci_t*)fun->dev->driver_data)->hc.device_manager;73 74 usb_address_t addr = device_keeper_find(manager, handle);72 usb_device_keeper_t *manager = &((uhci_t*)fun->dev->driver_data)->hc.device_manager; 73 74 usb_address_t addr = usb_device_keeper_find(manager, handle); 75 75 if (addr < 0) { 76 76 return addr; … … 167 167 CHECK_RET_DEST_FUN_RETURN(ret, 168 168 "Failed(%d) to get I/O addresses:.\n", ret, device->handle); 169 usb_log_ info("I/O regs at 0x%X (size %zu), IRQ %d.\n",169 usb_log_debug("I/O regs at 0x%X (size %zu), IRQ %d.\n", 170 170 io_reg_base, io_reg_size, irq); 171 171 -
uspace/drv/uhci-hcd/uhci_hc.c
r4fb6d9ee re099f26 121 121 fibril_create(uhci_hc_interrupt_emulator, instance); 122 122 fibril_add_ready(instance->cleaner); 123 } else { 124 /* TODO: enable interrupts here */ 123 125 } 124 126 … … 127 129 // fibril_add_ready(instance->debug_checker); 128 130 129 usb_log_info("Started UHCI driver.\n");130 131 return EOK; 131 132 #undef CHECK_RET_DEST_FUN_RETURN … … 235 236 236 237 /* Init device keeper*/ 237 device_keeper_init(&instance->device_manager);238 usb_device_keeper_init(&instance->device_manager); 238 239 usb_log_debug("Initialized device manager.\n"); 239 240 … … 317 318 * Checks for bandwidth availability and appends the batch to the proper queue. 318 319 */ 319 int uhci_hc_schedule(uhci_hc_t *instance, batch_t *batch)320 int uhci_hc_schedule(uhci_hc_t *instance, usb_transfer_batch_t *batch) 320 321 { 321 322 assert(instance); -
uspace/drv/uhci-hcd/uhci_hc.h
r4fb6d9ee re099f26 42 42 43 43 #include <usbhc_iface.h> 44 #include <usb/host/device_keeper.h> 44 45 45 46 #include "batch.h" 46 47 #include "transfer_list.h" 47 #include "utils/device_keeper.h"48 48 49 49 typedef struct uhci_regs { … … 83 83 84 84 typedef struct uhci_hc { 85 device_keeper_t device_manager;85 usb_device_keeper_t device_manager; 86 86 87 87 regs_t *registers; … … 109 109 void *regs, size_t reg_size, bool interupts); 110 110 111 int uhci_hc_schedule(uhci_hc_t *instance, batch_t *batch);111 int uhci_hc_schedule(uhci_hc_t *instance, usb_transfer_batch_t *batch); 112 112 113 113 void uhci_hc_interrupt(uhci_hc_t *instance, uint16_t status);
Note:
See TracChangeset
for help on using the changeset viewer.
