Changeset af16ebe in mainline


Ignore:
Timestamp:
2018-02-05T00:54:52Z (6 years ago)
Author:
Ondřej Hlavatý <aearsis@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
239eea41
Parents:
c21e6a5
git-author:
Ondřej Hlavatý <aearsis@…> (2018-02-05 00:49:07)
git-committer:
Ondřej Hlavatý <aearsis@…> (2018-02-05 00:54:52)
Message:

usb: redefine max_transfer_size

Location:
uspace
Files:
5 edited

Legend:

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

    rc21e6a5 raf16ebe  
    9292                        ep->max_transfer_size = ep->max_packet_size * ep->packets_per_uframe;
    9393                }
    94                 else {
    95                         ep->max_transfer_size = 200 * PAGE_SIZE;
    96                 }
    9794        }
    9895
  • uspace/drv/bus/usb/xhci/trb_ring.c

    rc21e6a5 raf16ebe  
    223223        errno_t err;
    224224        assert(trbs > 0);
     225
     226        if (trbs > xhci_trb_ring_size(ring))
     227                return ELIMIT;
     228
    225229        fibril_mutex_lock(&ring->guard);
    226230
     
    309313}
    310314
     315size_t xhci_trb_ring_size(xhci_trb_ring_t *ring)
     316{
     317        return ring->segment_count * SEGMENT_TRB_USEFUL_COUNT;
     318}
     319
    311320/**
    312321 * Initializes an event ring.
  • uspace/drv/bus/usb/xhci/trb_ring.h

    rc21e6a5 raf16ebe  
    7878extern errno_t xhci_trb_ring_enqueue(xhci_trb_ring_t *, xhci_trb_t *, uintptr_t *);
    7979extern errno_t xhci_trb_ring_enqueue_multiple(xhci_trb_ring_t *, xhci_trb_t *, size_t, uintptr_t *);
     80extern size_t xhci_trb_ring_size(xhci_trb_ring_t *);
    8081
    8182extern void xhci_trb_ring_reset_dequeue_state(xhci_trb_ring_t *ring, uintptr_t *addr);
  • uspace/lib/drv/include/usbhc_iface.h

    rc21e6a5 raf16ebe  
    116116        usb_direction_t direction;
    117117
    118         /** Maximum size of one transfer */
     118        /**
     119         * Maximum size of one transfer. Non-periodic endpoints may handle
     120         * bigger transfers, but those can be split into multiple USB transfers.
     121         */
    119122        size_t max_transfer_size;
    120123
  • uspace/lib/usbhost/src/endpoint.c

    rc21e6a5 raf16ebe  
    244244        }
    245245
    246         /** Limit transfers with reserved bandwidth to the amount reserved */
    247         if (ep->direction == USB_DIRECTION_OUT && size > ep->max_transfer_size)
    248                 return ENOSPC;
     246        /*
     247         * Limit transfers with reserved bandwidth to the amount reserved.
     248         * OUT transfers are rejected, IN can be just trimmed in advance.
     249         */
     250        if ((ep->transfer_type == USB_TRANSFER_INTERRUPT || ep->transfer_type == USB_TRANSFER_ISOCHRONOUS) && size > ep->max_transfer_size) {
     251                if (direction == USB_DIRECTION_OUT)
     252                        return ENOSPC;
     253                else
     254                        size = ep->max_transfer_size;
     255
     256        }
    249257
    250258        /* Offline devices don't schedule transfers other than on EP0. */
Note: See TracChangeset for help on using the changeset viewer.