Changeset 51c1d500 in mainline for uspace/drv/bus/usb/xhci/transfers.c


Ignore:
Timestamp:
2018-01-20T17:16:33Z (6 years ago)
Author:
Ondřej Hlavatý <aearsis@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
6271a34
Parents:
abb5d08
Message:

xhci: move HC semantics from endpoint/device to hc module

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/drv/bus/usb/xhci/transfers.c

    rabb5d08 r51c1d500  
    120120}
    121121
    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;
     122static 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);
    135126}
    136127
     
    138129{
    139130        usb_transfer_batch_t *batch = &transfer->batch;
    140         xhci_trb_ring_t *ring = get_ring(hc, transfer);
    141131        xhci_endpoint_t *xhci_ep = xhci_endpoint_get(transfer->batch.ep);
    142132
     
    202192        }
    203193
    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);
    205195}
    206196
     
    224214                TRB_CTRL_SET_TRB_TYPE(trb, XHCI_TRB_TYPE_NORMAL);
    225215
    226                 xhci_trb_ring_t* ring = get_ring(hc, transfer);
     216                xhci_trb_ring_t* ring = get_ring(transfer);
    227217                return xhci_trb_ring_enqueue(ring, &trb, &transfer->interrupt_trb_phys);
    228218        }
     
    233223                TRB_CTRL_SET_ENT(trb, 1);
    234224
    235                 xhci_trb_ring_t* ring = get_ring(hc, transfer);
     225                xhci_trb_ring_t* ring = get_ring(transfer);
    236226                if (!ring) {
    237227                        return EINVAL;
     
    269259        TRB_CTRL_SET_TRB_TYPE(trb, XHCI_TRB_TYPE_NORMAL);
    270260
    271         xhci_trb_ring_t* ring = get_ring(hc, transfer);
     261        xhci_trb_ring_t* ring = get_ring(transfer);
    272262
    273263        return xhci_trb_ring_enqueue(ring, &trb, &transfer->interrupt_trb_phys);
     
    313303                /* We are received transfer pointer instead - work with that */
    314304                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);
    317306                batch = &transfer->batch;
    318307
     
    497486        }
    498487
     488        hc_ring_ep_doorbell(xhci_ep, batch->target.stream);
     489
    499490        /* After the critical section, the transfer can already be finished or aborted. */
    500491        transfer = NULL; batch = NULL;
    501492        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);
    507493        return EOK;
    508494}
Note: See TracChangeset for help on using the changeset viewer.