Changeset 19f0048 in mainline for uspace/drv/bus/usb/xhci/trb_ring.c


Ignore:
Timestamp:
2018-02-01T02:13:34Z (6 years ago)
Author:
Ondřej Hlavatý <aearsis@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
17d34a8
Parents:
53fdf8c
Message:

xhci: reinitialize in case of HC error

File:
1 edited

Legend:

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

    r53fdf8c r19f0048  
    188188static uintptr_t trb_ring_enqueue_phys(xhci_trb_ring_t *ring)
    189189{
    190         uintptr_t trb_id = ring->enqueue_trb - segment_begin(ring->enqueue_segment);
     190        size_t trb_id = ring->enqueue_trb - segment_begin(ring->enqueue_segment);
    191191        return ring->enqueue_segment->phys + trb_id * sizeof(xhci_trb_t);
    192192}
     
    346346        }
    347347
     348        fibril_mutex_initialize(&ring->guard);
     349
     350        usb_log_debug("Initialized event ring.");
     351        return EOK;
     352}
     353
     354void xhci_event_ring_reset(xhci_event_ring_t *ring)
     355{
     356        list_foreach(ring->segments, segments_link, trb_segment_t, segment)
     357                memset(segment->trb_storage, 0, sizeof(segment->trb_storage));
     358
    348359        trb_segment_t * const segment = get_first_segment(&ring->segments);
    349360        ring->dequeue_segment = segment;
     
    351362        ring->dequeue_ptr = segment->phys;
    352363        ring->ccs = 1;
    353 
    354         fibril_mutex_initialize(&ring->guard);
    355 
    356         usb_log_debug("Initialized event ring.");
    357         return EOK;
    358364}
    359365
     
    432438        ring->end = ring->begin + size;
    433439
    434         ring->enqueue = ring->dequeue = ring->begin;
    435 
    436440        fibril_mutex_initialize(&ring->guard);
    437441        fibril_condvar_initialize(&ring->enqueued_cv);
    438442        fibril_condvar_initialize(&ring->dequeued_cv);
    439443
    440         ring->running = true;
     444        xhci_sw_ring_restart(ring);
    441445}
    442446
     
    486490}
    487491
     492void xhci_sw_ring_restart(xhci_sw_ring_t *ring)
     493{
     494        ring->enqueue = ring->dequeue = ring->begin;
     495        memset(ring->begin, 0, sizeof(xhci_trb_t) * (ring->end - ring->begin));
     496        ring->running = true;
     497}
     498
    488499void xhci_sw_ring_fini(xhci_sw_ring_t *ring)
    489500{
Note: See TracChangeset for help on using the changeset viewer.