Changeset 5a2c42b in mainline for uspace/drv/ohci/hc.c
- Timestamp:
- 2011-04-13T12:37:20Z (14 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 592369ae
- Parents:
- 2759c52
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/ohci/hc.c
r2759c52 r5a2c42b 155 155 return ENOMEM; 156 156 } 157 // TODO: enqueue hcd_ep here!158 157 159 158 ret = usb_endpoint_manager_register_ep(&instance->ep_manager, ep, size); 160 159 if (ret != EOK) { 161 160 endpoint_destroy(ep); 162 } 161 return ret; 162 } 163 164 /* Enqueue hcd_ep */ 165 switch (ep->transfer_type) { 166 case USB_TRANSFER_CONTROL: 167 instance->registers->control &= ~C_CLE; 168 endpoint_list_add_ep( 169 &instance->lists[ep->transfer_type], hcd_ep); 170 instance->registers->control_current = 0; 171 instance->registers->control |= C_CLE; 172 break; 173 case USB_TRANSFER_BULK: 174 instance->registers->control &= ~C_BLE; 175 endpoint_list_add_ep( 176 &instance->lists[ep->transfer_type], hcd_ep); 177 instance->registers->control |= C_BLE; 178 break; 179 case USB_TRANSFER_ISOCHRONOUS: 180 case USB_TRANSFER_INTERRUPT: 181 instance->registers->control &= (~C_PLE & ~C_IE); 182 endpoint_list_add_ep( 183 &instance->lists[ep->transfer_type], hcd_ep); 184 instance->registers->control |= C_PLE | C_IE; 185 break; 186 default: 187 break; 188 } 189 163 190 return ret; 164 191 } … … 176 203 hcd_endpoint_t *hcd_ep = hcd_endpoint_get(ep); 177 204 if (hcd_ep) { 178 // TODO: dequeue hcd_ep here! 205 /* Dequeue hcd_ep */ 206 switch (ep->transfer_type) { 207 case USB_TRANSFER_CONTROL: 208 instance->registers->control &= ~C_CLE; 209 endpoint_list_remove_ep( 210 &instance->lists[ep->transfer_type], hcd_ep); 211 instance->registers->control_current = 0; 212 instance->registers->control |= C_CLE; 213 break; 214 case USB_TRANSFER_BULK: 215 instance->registers->control &= ~C_BLE; 216 endpoint_list_remove_ep( 217 &instance->lists[ep->transfer_type], hcd_ep); 218 instance->registers->control |= C_BLE; 219 break; 220 case USB_TRANSFER_ISOCHRONOUS: 221 case USB_TRANSFER_INTERRUPT: 222 instance->registers->control &= (~C_PLE & ~C_IE); 223 endpoint_list_remove_ep( 224 &instance->lists[ep->transfer_type], hcd_ep); 225 instance->registers->control |= C_PLE | C_IE; 226 break; 227 default: 228 break; 229 } 179 230 hcd_endpoint_clear(ep); 180 231 } else { … … 195 246 return rh_request(&instance->rh, batch); 196 247 } 197 248 #if 0 198 249 fibril_mutex_lock(&instance->guard); 199 250 switch (batch->ep->transfer_type) { … … 230 281 } 231 282 fibril_mutex_unlock(&instance->guard); 283 #endif 232 284 return EOK; 233 285 } … … 249 301 usb_log_debug2("Periodic current: %p.\n", 250 302 instance->registers->periodic_current); 303 #if 0 251 304 LIST_INITIALIZE(done); 252 305 transfer_list_remove_finished( … … 267 320 } 268 321 fibril_mutex_unlock(&instance->guard); 322 #endif 269 323 } 270 324 } … … 358 412 359 413 /* Use queues */ 360 instance->registers->bulk_head = instance->transfers_bulk.list_head_pa; 414 instance->registers->bulk_head = 415 instance->lists[USB_TRANSFER_BULK].list_head_pa; 361 416 usb_log_debug2("Bulk HEAD set to: %p(%p).\n", 362 instance-> transfers_bulk.list_head,363 instance-> transfers_bulk.list_head_pa);417 instance->lists[USB_TRANSFER_BULK].list_head, 418 instance->lists[USB_TRANSFER_BULK].list_head_pa); 364 419 365 420 instance->registers->control_head = 366 instance-> transfers_control.list_head_pa;421 instance->lists[USB_TRANSFER_CONTROL].list_head_pa; 367 422 usb_log_debug2("Control HEAD set to: %p(%p).\n", 368 instance-> transfers_control.list_head,369 instance-> transfers_control.list_head_pa);423 instance->lists[USB_TRANSFER_CONTROL].list_head, 424 instance->lists[USB_TRANSFER_CONTROL].list_head_pa); 370 425 371 426 /* Enable queues */ … … 398 453 assert(instance); 399 454 400 #define SETUP_ TRANSFER_LIST(type, name) \455 #define SETUP_ENDPOINT_LIST(type) \ 401 456 do { \ 402 int ret = transfer_list_init(&instance->type, name); \ 457 const char *name = usb_str_transfer_type(type); \ 458 int ret = endpoint_list_init(&instance->lists[type], name); \ 403 459 if (ret != EOK) { \ 404 usb_log_error("Failed(%d) to setup %s transferlist.\n", \460 usb_log_error("Failed(%d) to setup %s endpoint list.\n", \ 405 461 ret, name); \ 406 transfer_list_fini(&instance->transfers_isochronous); \407 transfer_list_fini(&instance->transfers_interrupt); \408 transfer_list_fini(&instance->transfers_control); \409 transfer_list_fini(&instance->transfers_bulk); \462 endpoint_list_fini(&instance->lists[USB_TRANSFER_ISOCHRONOUS]); \ 463 endpoint_list_fini(&instance->lists[USB_TRANSFER_INTERRUPT]); \ 464 endpoint_list_fini(&instance->lists[USB_TRANSFER_CONTROL]); \ 465 endpoint_list_fini(&instance->lists[USB_TRANSFER_BULK]); \ 410 466 } \ 411 467 } while (0) 412 468 413 SETUP_TRANSFER_LIST(transfers_isochronous, "ISOCHRONOUS"); 414 SETUP_TRANSFER_LIST(transfers_interrupt, "INTERRUPT"); 415 SETUP_TRANSFER_LIST(transfers_control, "CONTROL"); 416 SETUP_TRANSFER_LIST(transfers_bulk, "BULK"); 417 #undef SETUP_TRANSFER_LIST 418 transfer_list_set_next(&instance->transfers_interrupt, 419 &instance->transfers_isochronous); 420 421 /* Assign pointers to be used during scheduling */ 422 instance->transfers[USB_TRANSFER_INTERRUPT] = 423 &instance->transfers_interrupt; 424 instance->transfers[USB_TRANSFER_ISOCHRONOUS] = 425 &instance->transfers_interrupt; 426 instance->transfers[USB_TRANSFER_CONTROL] = 427 &instance->transfers_control; 428 instance->transfers[USB_TRANSFER_BULK] = 429 &instance->transfers_bulk; 469 SETUP_ENDPOINT_LIST(USB_TRANSFER_ISOCHRONOUS); 470 SETUP_ENDPOINT_LIST(USB_TRANSFER_INTERRUPT); 471 SETUP_ENDPOINT_LIST(USB_TRANSFER_CONTROL); 472 SETUP_ENDPOINT_LIST(USB_TRANSFER_BULK); 473 #undef SETUP_ENDPOINT_LIST 474 endpoint_list_set_next(&instance->lists[USB_TRANSFER_INTERRUPT], 475 &instance->lists[USB_TRANSFER_ISOCHRONOUS]); 430 476 431 477 return EOK; … … 448 494 for (; i < 32; ++i) { 449 495 instance->hcca->int_ep[i] = 450 instance-> transfers_interrupt.list_head_pa;496 instance->lists[USB_TRANSFER_INTERRUPT].list_head_pa; 451 497 } 452 498 usb_log_debug2("Interrupt HEADs set to: %p(%p).\n", 453 instance-> transfers_interrupt.list_head,454 instance-> transfers_interrupt.list_head_pa);499 instance->lists[USB_TRANSFER_INTERRUPT].list_head, 500 instance->lists[USB_TRANSFER_INTERRUPT].list_head_pa); 455 501 456 502 return EOK;
Note:
See TracChangeset
for help on using the changeset viewer.