uhci: Store ep in UHCIQueue
This avoids the need to repeatedly lookup the device, and ep. Signed-off-by: Hans de Goede <hdegoede@redhat.com> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
This commit is contained in:
		
							parent
							
								
									a4f30cd766
								
							
						
					
					
						commit
						11d15e402b
					
				@ -107,6 +107,7 @@ struct UHCIAsync {
 | 
				
			|||||||
struct UHCIQueue {
 | 
					struct UHCIQueue {
 | 
				
			||||||
    uint32_t  token;
 | 
					    uint32_t  token;
 | 
				
			||||||
    UHCIState *uhci;
 | 
					    UHCIState *uhci;
 | 
				
			||||||
 | 
					    USBEndpoint *ep;
 | 
				
			||||||
    QTAILQ_ENTRY(UHCIQueue) next;
 | 
					    QTAILQ_ENTRY(UHCIQueue) next;
 | 
				
			||||||
    QTAILQ_HEAD(, UHCIAsync) asyncs;
 | 
					    QTAILQ_HEAD(, UHCIAsync) asyncs;
 | 
				
			||||||
    int8_t    valid;
 | 
					    int8_t    valid;
 | 
				
			||||||
@ -161,7 +162,7 @@ typedef struct UHCI_QH {
 | 
				
			|||||||
} UHCI_QH;
 | 
					} UHCI_QH;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void uhci_async_cancel(UHCIAsync *async);
 | 
					static void uhci_async_cancel(UHCIAsync *async);
 | 
				
			||||||
static void uhci_queue_fill(UHCIQueue *q, UHCI_TD *td, struct USBEndpoint *ep);
 | 
					static void uhci_queue_fill(UHCIQueue *q, UHCI_TD *td);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static inline int32_t uhci_queue_token(UHCI_TD *td)
 | 
					static inline int32_t uhci_queue_token(UHCI_TD *td)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@ -169,7 +170,7 @@ static inline int32_t uhci_queue_token(UHCI_TD *td)
 | 
				
			|||||||
    return td->token & 0x7ffff;
 | 
					    return td->token & 0x7ffff;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static UHCIQueue *uhci_queue_get(UHCIState *s, UHCI_TD *td)
 | 
					static UHCIQueue *uhci_queue_get(UHCIState *s, UHCI_TD *td, USBEndpoint *ep)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    uint32_t token = uhci_queue_token(td);
 | 
					    uint32_t token = uhci_queue_token(td);
 | 
				
			||||||
    UHCIQueue *queue;
 | 
					    UHCIQueue *queue;
 | 
				
			||||||
@ -183,6 +184,7 @@ static UHCIQueue *uhci_queue_get(UHCIState *s, UHCI_TD *td)
 | 
				
			|||||||
    queue = g_new0(UHCIQueue, 1);
 | 
					    queue = g_new0(UHCIQueue, 1);
 | 
				
			||||||
    queue->uhci = s;
 | 
					    queue->uhci = s;
 | 
				
			||||||
    queue->token = token;
 | 
					    queue->token = token;
 | 
				
			||||||
 | 
					    queue->ep = ep;
 | 
				
			||||||
    QTAILQ_INIT(&queue->asyncs);
 | 
					    QTAILQ_INIT(&queue->asyncs);
 | 
				
			||||||
    QTAILQ_INSERT_HEAD(&s->queues, queue, next);
 | 
					    QTAILQ_INSERT_HEAD(&s->queues, queue, next);
 | 
				
			||||||
    trace_usb_uhci_queue_add(queue->token);
 | 
					    trace_usb_uhci_queue_add(queue->token);
 | 
				
			||||||
@ -790,11 +792,9 @@ static int uhci_handle_td(UHCIState *s, UHCIQueue *q,
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
    UHCIAsync *async;
 | 
					    UHCIAsync *async;
 | 
				
			||||||
    int len = 0, max_len;
 | 
					    int len = 0, max_len;
 | 
				
			||||||
    uint8_t pid;
 | 
					 | 
				
			||||||
    bool spd;
 | 
					    bool spd;
 | 
				
			||||||
    USBDevice *dev;
 | 
					 | 
				
			||||||
    USBEndpoint *ep;
 | 
					 | 
				
			||||||
    bool queuing = (q != NULL);
 | 
					    bool queuing = (q != NULL);
 | 
				
			||||||
 | 
					    uint8_t pid = td->token & 0xff;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* Is active ? */
 | 
					    /* Is active ? */
 | 
				
			||||||
    if (!(td->ctrl & TD_CTRL_ACTIVE)) {
 | 
					    if (!(td->ctrl & TD_CTRL_ACTIVE)) {
 | 
				
			||||||
@ -828,7 +828,9 @@ static int uhci_handle_td(UHCIState *s, UHCIQueue *q,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    /* Allocate new packet */
 | 
					    /* Allocate new packet */
 | 
				
			||||||
    if (q == NULL) {
 | 
					    if (q == NULL) {
 | 
				
			||||||
        q = uhci_queue_get(s, td);
 | 
					        USBDevice *dev = uhci_find_device(s, (td->token >> 8) & 0x7f);
 | 
				
			||||||
 | 
					        USBEndpoint *ep = usb_ep_get(dev, pid, (td->token >> 15) & 0xf);
 | 
				
			||||||
 | 
					        q = uhci_queue_get(s, td, ep);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    async = uhci_async_alloc(q, td_addr);
 | 
					    async = uhci_async_alloc(q, td_addr);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -838,12 +840,8 @@ static int uhci_handle_td(UHCIState *s, UHCIQueue *q,
 | 
				
			|||||||
    async->queue->valid = 32;
 | 
					    async->queue->valid = 32;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    max_len = ((td->token >> 21) + 1) & 0x7ff;
 | 
					    max_len = ((td->token >> 21) + 1) & 0x7ff;
 | 
				
			||||||
    pid = td->token & 0xff;
 | 
					 | 
				
			||||||
    spd = (pid == USB_TOKEN_IN && (td->ctrl & TD_CTRL_SPD) != 0);
 | 
					    spd = (pid == USB_TOKEN_IN && (td->ctrl & TD_CTRL_SPD) != 0);
 | 
				
			||||||
 | 
					    usb_packet_setup(&async->packet, pid, q->ep, td_addr, spd,
 | 
				
			||||||
    dev = uhci_find_device(s, (td->token >> 8) & 0x7f);
 | 
					 | 
				
			||||||
    ep = usb_ep_get(dev, pid, (td->token >> 15) & 0xf);
 | 
					 | 
				
			||||||
    usb_packet_setup(&async->packet, pid, ep, td_addr, spd,
 | 
					 | 
				
			||||||
                     (td->ctrl & TD_CTRL_IOC) != 0);
 | 
					                     (td->ctrl & TD_CTRL_IOC) != 0);
 | 
				
			||||||
    qemu_sglist_add(&async->sgl, td->buffer, max_len);
 | 
					    qemu_sglist_add(&async->sgl, td->buffer, max_len);
 | 
				
			||||||
    usb_packet_map(&async->packet, &async->sgl);
 | 
					    usb_packet_map(&async->packet, &async->sgl);
 | 
				
			||||||
@ -851,13 +849,13 @@ static int uhci_handle_td(UHCIState *s, UHCIQueue *q,
 | 
				
			|||||||
    switch(pid) {
 | 
					    switch(pid) {
 | 
				
			||||||
    case USB_TOKEN_OUT:
 | 
					    case USB_TOKEN_OUT:
 | 
				
			||||||
    case USB_TOKEN_SETUP:
 | 
					    case USB_TOKEN_SETUP:
 | 
				
			||||||
        len = usb_handle_packet(dev, &async->packet);
 | 
					        len = usb_handle_packet(q->ep->dev, &async->packet);
 | 
				
			||||||
        if (len >= 0)
 | 
					        if (len >= 0)
 | 
				
			||||||
            len = max_len;
 | 
					            len = max_len;
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    case USB_TOKEN_IN:
 | 
					    case USB_TOKEN_IN:
 | 
				
			||||||
        len = usb_handle_packet(dev, &async->packet);
 | 
					        len = usb_handle_packet(q->ep->dev, &async->packet);
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    default:
 | 
					    default:
 | 
				
			||||||
@ -872,7 +870,7 @@ static int uhci_handle_td(UHCIState *s, UHCIQueue *q,
 | 
				
			|||||||
    if (len == USB_RET_ASYNC) {
 | 
					    if (len == USB_RET_ASYNC) {
 | 
				
			||||||
        uhci_async_link(async);
 | 
					        uhci_async_link(async);
 | 
				
			||||||
        if (!queuing) {
 | 
					        if (!queuing) {
 | 
				
			||||||
            uhci_queue_fill(q, td, ep);
 | 
					            uhci_queue_fill(q, td);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        return TD_RESULT_ASYNC_START;
 | 
					        return TD_RESULT_ASYNC_START;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@ -945,7 +943,7 @@ static int qhdb_insert(QhDb *db, uint32_t addr)
 | 
				
			|||||||
    return 0;
 | 
					    return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void uhci_queue_fill(UHCIQueue *q, UHCI_TD *td, struct USBEndpoint *ep)
 | 
					static void uhci_queue_fill(UHCIQueue *q, UHCI_TD *td)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    uint32_t int_mask = 0;
 | 
					    uint32_t int_mask = 0;
 | 
				
			||||||
    uint32_t plink = td->link;
 | 
					    uint32_t plink = td->link;
 | 
				
			||||||
@ -969,7 +967,7 @@ static void uhci_queue_fill(UHCIQueue *q, UHCI_TD *td, struct USBEndpoint *ep)
 | 
				
			|||||||
        assert(int_mask == 0);
 | 
					        assert(int_mask == 0);
 | 
				
			||||||
        plink = ptd.link;
 | 
					        plink = ptd.link;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    usb_device_flush_ep_queue(ep->dev, ep);
 | 
					    usb_device_flush_ep_queue(q->ep->dev, q->ep);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void uhci_process_frame(UHCIState *s)
 | 
					static void uhci_process_frame(UHCIState *s)
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user