Changeset 51c1d500 in mainline for uspace/drv/bus/usb/xhci/transfers.c
- Timestamp:
- 2018-01-20T17:16:33Z (7 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 6271a34
- Parents:
- abb5d08
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/bus/usb/xhci/transfers.c
rabb5d08 r51c1d500 120 120 } 121 121 122 static xhci_trb_ring_t *get_ring(xhci_hc_t *hc, xhci_transfer_t *transfer) 123 { 124 xhci_endpoint_t *ep = xhci_endpoint_get(transfer->batch.ep); 125 if (ep->primary_stream_data_size == 0) return &ep->ring; 126 uint32_t stream_id = transfer->batch.target.stream; 127 128 xhci_stream_data_t *stream_data = xhci_get_stream_ctx_data(ep, stream_id); 129 if (stream_data == NULL) { 130 usb_log_warning("No transfer ring was found for stream %u.", stream_id); 131 return NULL; 132 } 133 134 return &stream_data->ring; 122 static xhci_trb_ring_t *get_ring(xhci_transfer_t *transfer) 123 { 124 xhci_endpoint_t *xhci_ep = xhci_endpoint_get(transfer->batch.ep); 125 return xhci_endpoint_get_ring(xhci_ep, transfer->batch.target.stream); 135 126 } 136 127 … … 138 129 { 139 130 usb_transfer_batch_t *batch = &transfer->batch; 140 xhci_trb_ring_t *ring = get_ring(hc, transfer);141 131 xhci_endpoint_t *xhci_ep = xhci_endpoint_get(transfer->batch.ep); 142 132 … … 202 192 } 203 193 204 return xhci_trb_ring_enqueue_multiple( ring, trbs, trbs_used, &transfer->interrupt_trb_phys);194 return xhci_trb_ring_enqueue_multiple(get_ring(transfer), trbs, trbs_used, &transfer->interrupt_trb_phys); 205 195 } 206 196 … … 224 214 TRB_CTRL_SET_TRB_TYPE(trb, XHCI_TRB_TYPE_NORMAL); 225 215 226 xhci_trb_ring_t* ring = get_ring( hc,transfer);216 xhci_trb_ring_t* ring = get_ring(transfer); 227 217 return xhci_trb_ring_enqueue(ring, &trb, &transfer->interrupt_trb_phys); 228 218 } … … 233 223 TRB_CTRL_SET_ENT(trb, 1); 234 224 235 xhci_trb_ring_t* ring = get_ring( hc,transfer);225 xhci_trb_ring_t* ring = get_ring(transfer); 236 226 if (!ring) { 237 227 return EINVAL; … … 269 259 TRB_CTRL_SET_TRB_TYPE(trb, XHCI_TRB_TYPE_NORMAL); 270 260 271 xhci_trb_ring_t* ring = get_ring( hc,transfer);261 xhci_trb_ring_t* ring = get_ring(transfer); 272 262 273 263 return xhci_trb_ring_enqueue(ring, &trb, &transfer->interrupt_trb_phys); … … 313 303 /* We are received transfer pointer instead - work with that */ 314 304 transfer = (xhci_transfer_t *) addr; 315 xhci_trb_ring_t * ring = get_ring(hc, transfer); 316 xhci_trb_ring_update_dequeue(ring, transfer->interrupt_trb_phys); 305 xhci_trb_ring_update_dequeue(get_ring(transfer), transfer->interrupt_trb_phys); 317 306 batch = &transfer->batch; 318 307 … … 497 486 } 498 487 488 hc_ring_ep_doorbell(xhci_ep, batch->target.stream); 489 499 490 /* After the critical section, the transfer can already be finished or aborted. */ 500 491 transfer = NULL; batch = NULL; 501 492 fibril_mutex_unlock(&ep->guard); 502 503 const uint8_t slot_id = xhci_dev->slot_id;504 /* EP Doorbells start at 1 */505 const uint8_t target = (xhci_endpoint_index(xhci_ep) + 1) | (batch->target.stream << 16);506 hc_ring_doorbell(hc, slot_id, target);507 493 return EOK; 508 494 }
Note:
See TracChangeset
for help on using the changeset viewer.