1 /*
2  * Copyright (C) 2015 Michael Brown <mbrown@fensystems.co.uk>.
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License as
6  * published by the Free Software Foundation; either version 2 of the
7  * License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful, but
10  * WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
17  * 02110-1301, USA.
18  *
19  * You can also choose to distribute this program under the terms of
20  * the Unmodified Binary Distribution Licence (as given in the file
21  * COPYING.UBDL), provided that you have satisfied its requirements.
22  */
23 
24 FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
25 
26 #include <strings.h>
27 #include <unistd.h>
28 #include <errno.h>
29 #include <byteswap.h>
30 #include <ipxe/malloc.h>
31 #include <ipxe/pci.h>
32 #include <ipxe/usb.h>
33 #include "ehci.h"
34 #include "uhci.h"
35 
36 /** @file
37  *
38  * USB Universal Host Controller Interface (UHCI) driver
39  *
40  */
41 
42 /******************************************************************************
43  *
44  * Register access
45  *
46  ******************************************************************************
47  */
48 
49 /**
50  * Check that address is reachable
51  *
52  * @v addr		Address
53  * @v len		Length
54  * @ret rc		Return status code
55  */
56 static inline __attribute__ (( always_inline)) int
uhci_reachable(void * addr,size_t len)57 uhci_reachable ( void *addr, size_t len ) {
58 	physaddr_t phys = virt_to_phys ( addr );
59 
60 	/* Always reachable in a 32-bit build */
61 	if ( sizeof ( physaddr_t ) <= sizeof ( uint32_t ) )
62 		return 0;
63 
64 	/* Reachable if below 4GB */
65 	if ( ( ( phys + len - 1 ) & ~0xffffffffULL ) == 0 )
66 		return 0;
67 
68 	return -ENOTSUP;
69 }
70 
71 /******************************************************************************
72  *
73  * Run / stop / reset
74  *
75  ******************************************************************************
76  */
77 
78 /**
79  * Start UHCI device
80  *
81  * @v uhci		UHCI device
82  */
uhci_run(struct uhci_device * uhci)83 static void uhci_run ( struct uhci_device *uhci ) {
84 	uint16_t usbcmd;
85 
86 	/* Set run/stop bit */
87 	usbcmd = inw ( uhci->regs + UHCI_USBCMD );
88 	usbcmd |= ( UHCI_USBCMD_RUN | UHCI_USBCMD_MAX64 );
89 	outw ( usbcmd, uhci->regs + UHCI_USBCMD );
90 }
91 
92 /**
93  * Stop UHCI device
94  *
95  * @v uhci		UHCI device
96  * @ret rc		Return status code
97  */
uhci_stop(struct uhci_device * uhci)98 static int uhci_stop ( struct uhci_device *uhci ) {
99 	uint16_t usbcmd;
100 	uint16_t usbsts;
101 	unsigned int i;
102 
103 	/* Clear run/stop bit */
104 	usbcmd = inw ( uhci->regs + UHCI_USBCMD );
105 	usbcmd &= ~UHCI_USBCMD_RUN;
106 	outw ( usbcmd, uhci->regs + UHCI_USBCMD );
107 
108 	/* Wait for device to stop */
109 	for ( i = 0 ; i < UHCI_STOP_MAX_WAIT_MS ; i++ ) {
110 
111 		/* Check if device is stopped */
112 		usbsts = inw ( uhci->regs + UHCI_USBSTS );
113 		if ( usbsts & UHCI_USBSTS_HCHALTED )
114 			return 0;
115 
116 		/* Delay */
117 		mdelay ( 1 );
118 	}
119 
120 	DBGC ( uhci, "UHCI %s timed out waiting for stop\n", uhci->name );
121 	return -ETIMEDOUT;
122 }
123 
124 /**
125  * Reset UHCI device
126  *
127  * @v uhci		UHCI device
128  * @ret rc		Return status code
129  */
uhci_reset(struct uhci_device * uhci)130 static int uhci_reset ( struct uhci_device *uhci ) {
131 	uint16_t usbcmd;
132 	unsigned int i;
133 	int rc;
134 
135 	/* The UHCI specification states that resetting a running
136 	 * device may result in undefined behaviour, so try stopping
137 	 * it first.
138 	 */
139 	if ( ( rc = uhci_stop ( uhci ) ) != 0 ) {
140 		/* Ignore errors and attempt to reset the device anyway */
141 	}
142 
143 	/* Reset device */
144 	outw ( UHCI_USBCMD_HCRESET, uhci->regs + UHCI_USBCMD );
145 
146 	/* Wait for reset to complete */
147 	for ( i = 0 ; i < UHCI_RESET_MAX_WAIT_MS ; i++ ) {
148 
149 		/* Check if reset is complete */
150 		usbcmd = inw ( uhci->regs + UHCI_USBCMD );
151 		if ( ! ( usbcmd & UHCI_USBCMD_HCRESET ) )
152 			return 0;
153 
154 		/* Delay */
155 		mdelay ( 1 );
156 	}
157 
158 	DBGC ( uhci, "UHCI %s timed out waiting for reset\n", uhci->name );
159 	return -ETIMEDOUT;
160 }
161 
162 /******************************************************************************
163  *
164  * Transfer descriptor rings
165  *
166  ******************************************************************************
167  */
168 
169 /**
170  * Allocate transfer ring
171  *
172  * @v ring		Transfer ring
173  * @ret rc		Return status code
174  */
uhci_ring_alloc(struct uhci_ring * ring)175 static int uhci_ring_alloc ( struct uhci_ring *ring ) {
176 	int rc;
177 
178 	/* Initialise structure */
179 	memset ( ring, 0, sizeof ( *ring ) );
180 
181 	/* Allocate queue head */
182 	ring->head = malloc_dma ( sizeof ( *ring->head ), UHCI_ALIGN );
183 	if ( ! ring->head ) {
184 		rc = -ENOMEM;
185 		goto err_alloc;
186 	}
187 	if ( ( rc = uhci_reachable ( ring->head,
188 				     sizeof ( *ring->head ) ) ) != 0 )
189 		goto err_unreachable;
190 
191 	/* Initialise queue head */
192 	ring->head->current = cpu_to_le32 ( UHCI_LINK_TERMINATE );
193 
194 	return 0;
195 
196  err_unreachable:
197 	free_dma ( ring->head, sizeof ( *ring->head ) );
198  err_alloc:
199 	return rc;
200 }
201 
202 /**
203  * Free transfer ring
204  *
205  * @v ring		Transfer ring
206  */
uhci_ring_free(struct uhci_ring * ring)207 static void uhci_ring_free ( struct uhci_ring *ring ) {
208 	unsigned int i;
209 
210 	/* Sanity checks */
211 	assert ( uhci_ring_fill ( ring ) == 0 );
212 	for ( i = 0 ; i < UHCI_RING_COUNT ; i++ )
213 		assert ( ring->xfer[i] == NULL );
214 
215 	/* Free queue head */
216 	free_dma ( ring->head, sizeof ( *ring->head ) );
217 }
218 
219 /**
220  * Enqueue new transfer
221  *
222  * @v ring		Transfer ring
223  * @v iobuf		I/O buffer
224  * @v count		Number of descriptors
225  * @ret rc		Return status code
226  */
uhci_enqueue(struct uhci_ring * ring,struct io_buffer * iobuf,unsigned int count)227 static int uhci_enqueue ( struct uhci_ring *ring, struct io_buffer *iobuf,
228 			  unsigned int count ) {
229 	struct uhci_transfer *xfer;
230 	struct uhci_transfer *end;
231 	struct uhci_transfer_descriptor *desc;
232 	unsigned int index = ( ring->prod % UHCI_RING_COUNT );
233 	uint32_t link;
234 	size_t len;
235 	int rc;
236 
237 	/* Sanity check */
238 	assert ( count > 0 );
239 	assert ( iobuf != NULL );
240 
241 	/* Check for space in ring */
242 	if ( ! uhci_ring_remaining ( ring ) ) {
243 		rc = -ENOBUFS;
244 		goto err_ring_full;
245 	}
246 
247 	/* Check for reachability of I/O buffer */
248 	if ( ( rc = uhci_reachable ( iobuf->data, iob_len ( iobuf ) ) ) != 0 )
249 		goto err_unreachable_iobuf;
250 
251 	/* Allocate transfer */
252 	xfer = malloc ( sizeof ( *xfer ) );
253 	if ( ! xfer ) {
254 		rc = -ENOMEM;
255 		goto err_alloc_xfer;
256 	}
257 
258 	/* Initialise transfer */
259 	xfer->prod = 0;
260 	xfer->cons = 0;
261 	xfer->len = 0;
262 	xfer->iobuf = iobuf;
263 
264 	/* Allocate transfer descriptors */
265 	len = ( count * sizeof ( xfer->desc[0] ) );
266 	xfer->desc = malloc_dma ( len, UHCI_ALIGN );
267 	if ( ! xfer->desc ) {
268 		rc = -ENOMEM;
269 		goto err_alloc_desc;
270 	}
271 	if ( ( rc = uhci_reachable ( xfer->desc, len ) ) != 0 )
272 		goto err_unreachable_desc;
273 
274 	/* Initialise transfer descriptors */
275 	memset ( xfer->desc, 0, len );
276 	desc = xfer->desc;
277 	for ( ; --count ; desc++ ) {
278 		link = ( virt_to_phys ( desc + 1 ) | UHCI_LINK_DEPTH_FIRST );
279 		desc->link = cpu_to_le32 ( link );
280 		desc->flags = ring->flags;
281 	}
282 	desc->link = cpu_to_le32 ( UHCI_LINK_TERMINATE );
283 	desc->flags = ( ring->flags | UHCI_FL_IOC );
284 
285 	/* Add to ring */
286 	wmb();
287 	link = virt_to_phys ( xfer->desc );
288 	if ( uhci_ring_fill ( ring ) > 0 ) {
289 		end = ring->end;
290 		end->desc[ end->prod - 1 ].link = cpu_to_le32 ( link );
291 	} else {
292 		ring->head->current = cpu_to_le32 ( link );
293 	}
294 	assert ( ring->xfer[index] == NULL );
295 	ring->xfer[index] = xfer;
296 	ring->end = xfer;
297 	ring->prod++;
298 
299 	return 0;
300 
301  err_unreachable_desc:
302 	free_dma ( xfer->desc, len );
303  err_alloc_desc:
304 	free ( xfer );
305  err_alloc_xfer:
306  err_unreachable_iobuf:
307  err_ring_full:
308 	return rc;
309 }
310 
311 /**
312  * Describe transfer
313  *
314  * @v ring		Transfer ring
315  * @v data		Data
316  * @v len		Length of data
317  * @v pid		Packet ID
318  */
uhci_describe(struct uhci_ring * ring,void * data,size_t len,uint8_t pid)319 static void uhci_describe ( struct uhci_ring *ring, void *data,
320 			    size_t len, uint8_t pid ) {
321 	struct uhci_transfer *xfer = ring->end;
322 	struct uhci_transfer_descriptor *desc;
323 	size_t frag_len;
324 	uint32_t control;
325 
326 	do {
327 		/* Calculate fragment length */
328 		frag_len = len;
329 		if ( frag_len > ring->mtu )
330 			frag_len = ring->mtu;
331 
332 		/* Populate descriptor */
333 		desc = &xfer->desc[xfer->prod++];
334 		if ( pid == USB_PID_IN )
335 			desc->flags |= UHCI_FL_SPD;
336 		control = ( ring->control | UHCI_CONTROL_PID ( pid ) |
337 			    UHCI_CONTROL_LEN ( frag_len ) );
338 		desc->control = cpu_to_le32 ( control );
339 		if ( data )
340 			desc->data = virt_to_phys ( data );
341 		wmb();
342 		desc->status = UHCI_STATUS_ACTIVE;
343 
344 		/* Update data toggle */
345 		ring->control ^= UHCI_CONTROL_TOGGLE;
346 
347 		/* Move to next descriptor */
348 		data += frag_len;
349 		len -= frag_len;
350 
351 	} while ( len );
352 }
353 
354 /**
355  * Dequeue transfer
356  *
357  * @v ring		Transfer ring
358  * @ret iobuf		I/O buffer
359  */
uhci_dequeue(struct uhci_ring * ring)360 static struct io_buffer * uhci_dequeue ( struct uhci_ring *ring ) {
361 	unsigned int index = ( ring->cons % UHCI_RING_COUNT );
362 	struct io_buffer *iobuf;
363 	struct uhci_transfer *xfer;
364 	size_t len;
365 
366 	/* Sanity checks */
367 	assert ( uhci_ring_fill ( ring ) > 0 );
368 
369 	/* Consume transfer */
370 	xfer = ring->xfer[index];
371 	assert ( xfer != NULL );
372 	assert ( xfer->desc != NULL );
373 	iobuf = xfer->iobuf;
374 	assert ( iobuf != NULL );
375 	ring->xfer[index] = NULL;
376 	ring->cons++;
377 
378 	/* Free transfer descriptors */
379 	len = ( xfer->prod * sizeof ( xfer->desc[0] ) );
380 	free_dma ( xfer->desc, len );
381 
382 	/* Free transfer */
383 	free ( xfer );
384 
385 	return iobuf;
386 }
387 
388 /**
389  * Restart ring
390  *
391  * @v ring		Transfer ring
392  * @v toggle		Expected data toggle for next descriptor
393  */
uhci_restart(struct uhci_ring * ring,uint32_t toggle)394 static void uhci_restart ( struct uhci_ring *ring, uint32_t toggle ) {
395 	struct uhci_transfer *xfer;
396 	struct uhci_transfer_descriptor *desc;
397 	struct uhci_transfer_descriptor *first;
398 	uint32_t link;
399 	unsigned int i;
400 	unsigned int j;
401 
402 	/* Sanity check */
403 	assert ( ring->head->current == cpu_to_le32 ( UHCI_LINK_TERMINATE ) );
404 
405 	/* If ring is empty, then just update the data toggle for the
406 	 * next descriptor.
407 	 */
408 	if ( uhci_ring_fill ( ring ) == 0 ) {
409 		ring->control &= ~UHCI_CONTROL_TOGGLE;
410 		ring->control |= toggle;
411 		return;
412 	}
413 
414 	/* If expected toggle does not match the toggle in the first
415 	 * unconsumed descriptor, then invert all toggles.
416 	 */
417 	xfer = ring->xfer[ ring->cons % UHCI_RING_COUNT ];
418 	assert ( xfer != NULL );
419 	assert ( xfer->cons == 0 );
420 	first = &xfer->desc[0];
421 	if ( ( le32_to_cpu ( first->control ) ^ toggle ) & UHCI_CONTROL_TOGGLE){
422 
423 		/* Invert toggle on all unconsumed transfer descriptors */
424 		for ( i = ring->cons ; i != ring->prod ; i++ ) {
425 			xfer = ring->xfer[ i % UHCI_RING_COUNT ];
426 			assert ( xfer != NULL );
427 			assert ( xfer->cons == 0 );
428 			for ( j = 0 ; j < xfer->prod ; j++ ) {
429 				desc = &xfer->desc[j];
430 				desc->control ^=
431 					cpu_to_le32 ( UHCI_CONTROL_TOGGLE );
432 			}
433 		}
434 
435 		/* Invert toggle for next descriptor to be enqueued */
436 		ring->control ^= UHCI_CONTROL_TOGGLE;
437 	}
438 
439 	/* Restart ring at first unconsumed transfer */
440 	link = virt_to_phys ( first );
441 	wmb();
442 	ring->head->current = cpu_to_le32 ( link );
443 }
444 
445 /******************************************************************************
446  *
447  * Schedule management
448  *
449  ******************************************************************************
450  */
451 
452 /**
453  * Get link value for a queue head
454  *
455  * @v queue		Queue head
456  * @ret link		Link value
457  */
uhci_link_qh(struct uhci_queue_head * queue)458 static inline uint32_t uhci_link_qh ( struct uhci_queue_head *queue ) {
459 
460 	return ( virt_to_phys ( queue ) | UHCI_LINK_TYPE_QH );
461 }
462 
463 /**
464  * (Re)build asynchronous schedule
465  *
466  * @v uhci		UHCI device
467  */
uhci_async_schedule(struct uhci_device * uhci)468 static void uhci_async_schedule ( struct uhci_device *uhci ) {
469 	struct uhci_endpoint *endpoint;
470 	struct uhci_queue_head *queue;
471 	uint32_t end;
472 	uint32_t link;
473 
474 	/* Build schedule in reverse order of execution.  Provided
475 	 * that we only ever add or remove single endpoints, this can
476 	 * safely run concurrently with hardware execution of the
477 	 * schedule.
478 	 */
479 	link = end = uhci_link_qh ( uhci->head );
480 	list_for_each_entry_reverse ( endpoint, &uhci->async, schedule ) {
481 		queue = endpoint->ring.head;
482 		queue->link = cpu_to_le32 ( link );
483 		wmb();
484 		link = uhci_link_qh ( queue );
485 	}
486 	if ( link == end )
487 		link = UHCI_LINK_TERMINATE;
488 	uhci->head->link = cpu_to_le32 ( link );
489 	wmb();
490 }
491 
492 /**
493  * Add endpoint to asynchronous schedule
494  *
495  * @v endpoint		Endpoint
496  */
uhci_async_add(struct uhci_endpoint * endpoint)497 static void uhci_async_add ( struct uhci_endpoint *endpoint ) {
498 	struct uhci_device *uhci = endpoint->uhci;
499 
500 	/* Add to end of schedule */
501 	list_add_tail ( &endpoint->schedule, &uhci->async );
502 
503 	/* Rebuild schedule */
504 	uhci_async_schedule ( uhci );
505 }
506 
507 /**
508  * Remove endpoint from asynchronous schedule
509  *
510  * @v endpoint		Endpoint
511  */
uhci_async_del(struct uhci_endpoint * endpoint)512 static void uhci_async_del ( struct uhci_endpoint *endpoint ) {
513 	struct uhci_device *uhci = endpoint->uhci;
514 
515 	/* Remove from schedule */
516 	list_check_contains_entry ( endpoint, &uhci->async, schedule );
517 	list_del ( &endpoint->schedule );
518 
519 	/* Rebuild schedule */
520 	uhci_async_schedule ( uhci );
521 
522 	/* Delay for a whole USB frame (with a 100% safety margin) */
523 	mdelay ( 2 );
524 }
525 
526 /**
527  * (Re)build periodic schedule
528  *
529  * @v uhci		UHCI device
530  */
uhci_periodic_schedule(struct uhci_device * uhci)531 static void uhci_periodic_schedule ( struct uhci_device *uhci ) {
532 	struct uhci_endpoint *endpoint;
533 	struct uhci_queue_head *queue;
534 	uint32_t link;
535 	uint32_t end;
536 	unsigned int max_interval;
537 	unsigned int i;
538 
539 	/* Build schedule in reverse order of execution.  Provided
540 	 * that we only ever add or remove single endpoints, this can
541 	 * safely run concurrently with hardware execution of the
542 	 * schedule.
543 	 */
544 	DBGCP ( uhci, "UHCI %s periodic schedule: ", uhci->name );
545 	link = end = uhci_link_qh ( uhci->head );
546 	list_for_each_entry_reverse ( endpoint, &uhci->periodic, schedule ) {
547 		queue = endpoint->ring.head;
548 		queue->link = cpu_to_le32 ( link );
549 		wmb();
550 		DBGCP ( uhci, "%s%d", ( ( link == end ) ? "" : "<-" ),
551 			endpoint->ep->interval );
552 		link = uhci_link_qh ( queue );
553 	}
554 	DBGCP ( uhci, "\n" );
555 
556 	/* Populate periodic frame list */
557 	DBGCP ( uhci, "UHCI %s periodic frame list:", uhci->name );
558 	for ( i = 0 ; i < UHCI_FRAMES ; i++ ) {
559 
560 		/* Calculate maximum interval (in microframes) which
561 		 * may appear as part of this frame list.
562 		 */
563 		if ( i == 0 ) {
564 			/* Start of list: include all endpoints */
565 			max_interval = -1U;
566 		} else {
567 			/* Calculate highest power-of-two frame interval */
568 			max_interval = ( 1 << ( ffs ( i ) - 1 ) );
569 			/* Convert to microframes */
570 			max_interval <<= 3;
571 			/* Round up to nearest 2^n-1 */
572 			max_interval = ( ( max_interval << 1 ) - 1 );
573 		}
574 
575 		/* Find first endpoint in schedule satisfying this
576 		 * maximum interval constraint.
577 		 */
578 		link = uhci_link_qh ( uhci->head );
579 		list_for_each_entry ( endpoint, &uhci->periodic, schedule ) {
580 			if ( endpoint->ep->interval <= max_interval ) {
581 				queue = endpoint->ring.head;
582 				link = uhci_link_qh ( queue );
583 				DBGCP ( uhci, " %d:%d",
584 					i, endpoint->ep->interval );
585 				break;
586 			}
587 		}
588 		uhci->frame->link[i] = cpu_to_le32 ( link );
589 	}
590 	wmb();
591 	DBGCP ( uhci, "\n" );
592 }
593 
594 /**
595  * Add endpoint to periodic schedule
596  *
597  * @v endpoint		Endpoint
598  */
uhci_periodic_add(struct uhci_endpoint * endpoint)599 static void uhci_periodic_add ( struct uhci_endpoint *endpoint ) {
600 	struct uhci_device *uhci = endpoint->uhci;
601 	struct uhci_endpoint *before;
602 	unsigned int interval = endpoint->ep->interval;
603 
604 	/* Find first endpoint with a smaller interval */
605 	list_for_each_entry ( before, &uhci->periodic, schedule ) {
606 		if ( before->ep->interval < interval )
607 			break;
608 	}
609 	list_add_tail ( &endpoint->schedule, &before->schedule );
610 
611 	/* Rebuild schedule */
612 	uhci_periodic_schedule ( uhci );
613 }
614 
615 /**
616  * Remove endpoint from periodic schedule
617  *
618  * @v endpoint		Endpoint
619  */
uhci_periodic_del(struct uhci_endpoint * endpoint)620 static void uhci_periodic_del ( struct uhci_endpoint *endpoint ) {
621 	struct uhci_device *uhci = endpoint->uhci;
622 
623 	/* Remove from schedule */
624 	list_check_contains_entry ( endpoint, &uhci->periodic, schedule );
625 	list_del ( &endpoint->schedule );
626 
627 	/* Rebuild schedule */
628 	uhci_periodic_schedule ( uhci );
629 
630 	/* Delay for a whole USB frame (with a 100% safety margin) */
631 	mdelay ( 2 );
632 }
633 
634 /**
635  * Add endpoint to appropriate schedule
636  *
637  * @v endpoint		Endpoint
638  */
uhci_schedule_add(struct uhci_endpoint * endpoint)639 static void uhci_schedule_add ( struct uhci_endpoint *endpoint ) {
640 	struct usb_endpoint *ep = endpoint->ep;
641 	unsigned int attr = ( ep->attributes & USB_ENDPOINT_ATTR_TYPE_MASK );
642 
643 	if ( attr == USB_ENDPOINT_ATTR_INTERRUPT ) {
644 		uhci_periodic_add ( endpoint );
645 	} else {
646 		uhci_async_add ( endpoint );
647 	}
648 }
649 
650 /**
651  * Remove endpoint from appropriate schedule
652  *
653  * @v endpoint		Endpoint
654  */
uhci_schedule_del(struct uhci_endpoint * endpoint)655 static void uhci_schedule_del ( struct uhci_endpoint *endpoint ) {
656 	struct usb_endpoint *ep = endpoint->ep;
657 	unsigned int attr = ( ep->attributes & USB_ENDPOINT_ATTR_TYPE_MASK );
658 
659 	if ( attr == USB_ENDPOINT_ATTR_INTERRUPT ) {
660 		uhci_periodic_del ( endpoint );
661 	} else {
662 		uhci_async_del ( endpoint );
663 	}
664 }
665 
666 /******************************************************************************
667  *
668  * Endpoint operations
669  *
670  ******************************************************************************
671  */
672 
673 /**
674  * Open endpoint
675  *
676  * @v ep		USB endpoint
677  * @ret rc		Return status code
678  */
uhci_endpoint_open(struct usb_endpoint * ep)679 static int uhci_endpoint_open ( struct usb_endpoint *ep ) {
680 	struct usb_device *usb = ep->usb;
681 	struct uhci_device *uhci = usb_get_hostdata ( usb );
682 	struct uhci_endpoint *endpoint;
683 	int rc;
684 
685 	/* Allocate and initialise structure */
686 	endpoint = zalloc ( sizeof ( *endpoint ) );
687 	if ( ! endpoint ) {
688 		rc = -ENOMEM;
689 		goto err_alloc;
690 	}
691 	endpoint->uhci = uhci;
692 	endpoint->ep = ep;
693 	usb_endpoint_set_hostdata ( ep, endpoint );
694 
695 	/* Initialise descriptor ring */
696 	if ( ( rc = uhci_ring_alloc ( &endpoint->ring ) ) != 0 )
697 		goto err_ring_alloc;
698 	endpoint->ring.mtu = ep->mtu;
699 	endpoint->ring.flags = UHCI_FL_CERR_MAX;
700 	if ( usb->speed < USB_SPEED_FULL )
701 		endpoint->ring.flags |= UHCI_FL_LS;
702 	endpoint->ring.control = ( UHCI_CONTROL_DEVICE ( usb->address ) |
703 				   UHCI_CONTROL_ENDPOINT ( ep->address ) );
704 
705 	/* Add to list of endpoints */
706 	list_add_tail ( &endpoint->list, &uhci->endpoints );
707 
708 	/* Add to schedule */
709 	uhci_schedule_add ( endpoint );
710 
711 	return 0;
712 
713 	uhci_ring_free ( &endpoint->ring );
714  err_ring_alloc:
715 	free ( endpoint );
716  err_alloc:
717 	return rc;
718 }
719 
720 /**
721  * Close endpoint
722  *
723  * @v ep		USB endpoint
724  */
uhci_endpoint_close(struct usb_endpoint * ep)725 static void uhci_endpoint_close ( struct usb_endpoint *ep ) {
726 	struct uhci_endpoint *endpoint = usb_endpoint_get_hostdata ( ep );
727 	struct io_buffer *iobuf;
728 
729 	/* Remove from schedule */
730 	uhci_schedule_del ( endpoint );
731 
732 	/* Cancel any incomplete transfers */
733 	while ( uhci_ring_fill ( &endpoint->ring ) ) {
734 		iobuf = uhci_dequeue ( &endpoint->ring );
735 		if ( iobuf )
736 			usb_complete_err ( ep, iobuf, -ECANCELED );
737 	}
738 
739 	/* Remove from list of endpoints */
740 	list_del ( &endpoint->list );
741 
742 	/* Free descriptor ring */
743 	uhci_ring_free ( &endpoint->ring );
744 
745 	/* Free endpoint */
746 	free ( endpoint );
747 }
748 
749 /**
750  * Reset endpoint
751  *
752  * @v ep		USB endpoint
753  * @ret rc		Return status code
754  */
uhci_endpoint_reset(struct usb_endpoint * ep)755 static int uhci_endpoint_reset ( struct usb_endpoint *ep ) {
756 	struct uhci_endpoint *endpoint = usb_endpoint_get_hostdata ( ep );
757 	struct uhci_ring *ring = &endpoint->ring;
758 
759 	/* Restart ring */
760 	uhci_restart ( ring, 0 );
761 
762 	return 0;
763 }
764 
765 /**
766  * Update MTU
767  *
768  * @v ep		USB endpoint
769  * @ret rc		Return status code
770  */
uhci_endpoint_mtu(struct usb_endpoint * ep)771 static int uhci_endpoint_mtu ( struct usb_endpoint *ep ) {
772 	struct uhci_endpoint *endpoint = usb_endpoint_get_hostdata ( ep );
773 
774 	/* Update endpoint MTU */
775 	endpoint->ring.mtu = ep->mtu;
776 
777 	return 0;
778 }
779 
780 /**
781  * Enqueue message transfer
782  *
783  * @v ep		USB endpoint
784  * @v iobuf		I/O buffer
785  * @ret rc		Return status code
786  */
uhci_endpoint_message(struct usb_endpoint * ep,struct io_buffer * iobuf)787 static int uhci_endpoint_message ( struct usb_endpoint *ep,
788 				   struct io_buffer *iobuf ) {
789 	struct uhci_endpoint *endpoint = usb_endpoint_get_hostdata ( ep );
790 	struct uhci_ring *ring = &endpoint->ring;
791 	struct usb_setup_packet *packet;
792 	unsigned int count;
793 	size_t len;
794 	int input;
795 	int rc;
796 
797 	/* Calculate number of descriptors */
798 	assert ( iob_len ( iobuf ) >= sizeof ( *packet ) );
799 	len = ( iob_len ( iobuf ) - sizeof ( *packet ) );
800 	count = ( 1 /* setup stage */ +
801 		  ( ( len + ring->mtu - 1 ) / ring->mtu ) /* data stage */ +
802 		  1 /* status stage */ );
803 
804 	/* Enqueue transfer */
805 	if ( ( rc = uhci_enqueue ( ring, iobuf, count ) ) != 0 )
806 		return rc;
807 
808 	/* Describe setup stage */
809 	packet = iobuf->data;
810 	ring->control &= ~UHCI_CONTROL_TOGGLE;
811 	uhci_describe ( ring, packet, sizeof ( *packet ), USB_PID_SETUP );
812 	iob_pull ( iobuf, sizeof ( *packet ) );
813 
814 	/* Describe data stage, if applicable */
815 	assert ( ring->control & UHCI_CONTROL_TOGGLE );
816 	input = ( packet->request & cpu_to_le16 ( USB_DIR_IN ) );
817 	if ( len ) {
818 		uhci_describe ( ring, iobuf->data, len,
819 				( input ? USB_PID_IN : USB_PID_OUT ) );
820 	}
821 
822 	/* Describe status stage */
823 	ring->control |= UHCI_CONTROL_TOGGLE;
824 	uhci_describe ( ring, NULL, 0,
825 			( ( len && input ) ? USB_PID_OUT : USB_PID_IN ) );
826 
827 	/* Sanity check */
828 	assert ( ring->end->prod == count );
829 
830 	return 0;
831 }
832 
833 /**
834  * Enqueue stream transfer
835  *
836  * @v ep		USB endpoint
837  * @v iobuf		I/O buffer
838  * @v zlp		Append a zero-length packet
839  * @ret rc		Return status code
840  */
uhci_endpoint_stream(struct usb_endpoint * ep,struct io_buffer * iobuf,int zlp)841 static int uhci_endpoint_stream ( struct usb_endpoint *ep,
842 				  struct io_buffer *iobuf, int zlp ) {
843 	struct uhci_endpoint *endpoint = usb_endpoint_get_hostdata ( ep );
844 	struct uhci_ring *ring = &endpoint->ring;
845 	unsigned int count;
846 	size_t len;
847 	int input;
848 	int rc;
849 
850 	/* Calculate number of descriptors */
851 	len = iob_len ( iobuf );
852 	count = ( ( ( len + ring->mtu - 1 ) / ring->mtu ) + ( zlp ? 1 : 0 ) );
853 
854 	/* Enqueue transfer */
855 	if ( ( rc = uhci_enqueue ( ring, iobuf, count ) ) != 0 )
856 		return rc;
857 
858 	/* Describe data packet */
859 	input = ( ep->address & USB_DIR_IN );
860 	uhci_describe ( ring, iobuf->data, len,
861 			( input ? USB_PID_IN : USB_PID_OUT ) );
862 
863 	/* Describe zero-length packet, if applicable */
864 	if ( zlp )
865 		uhci_describe ( ring, NULL, 0, USB_PID_OUT );
866 
867 	/* Sanity check */
868 	assert ( ring->end->prod == count );
869 
870 	return 0;
871 }
872 
873 /**
874  * Check if transfer is a message transfer
875  *
876  * @v xfer		UHCI transfer
877  * @ret is_message	Transfer is a message transfer
878  */
uhci_is_message(struct uhci_transfer * xfer)879 static inline int uhci_is_message ( struct uhci_transfer *xfer ) {
880 	struct uhci_transfer_descriptor *desc = &xfer->desc[0];
881 
882 	return ( ( desc->control & cpu_to_le32 ( UHCI_CONTROL_PID_MASK ) ) ==
883 		 cpu_to_le32 ( UHCI_CONTROL_PID ( USB_PID_SETUP ) ) );
884 }
885 
886 /**
887  * Poll for completions
888  *
889  * @v endpoint		Endpoint
890  */
uhci_endpoint_poll(struct uhci_endpoint * endpoint)891 static void uhci_endpoint_poll ( struct uhci_endpoint *endpoint ) {
892 	struct uhci_ring *ring = &endpoint->ring;
893 	struct uhci_device *uhci = endpoint->uhci;
894 	struct usb_endpoint *ep = endpoint->ep;
895 	struct usb_device *usb = ep->usb;
896 	struct uhci_transfer *xfer;
897 	struct uhci_transfer_descriptor *desc;
898 	struct io_buffer *iobuf;
899 	unsigned int index;
900 	uint32_t link;
901 	uint32_t toggle;
902 	uint32_t control;
903 	uint16_t actual;
904 	size_t len;
905 
906 	/* Consume all completed descriptors */
907 	while ( uhci_ring_fill ( ring ) ) {
908 
909 		/* Stop if we reach an uncompleted descriptor */
910 		index = ( ring->cons % UHCI_RING_COUNT );
911 		xfer = ring->xfer[index];
912 		assert ( xfer != NULL );
913 		assert ( xfer->cons < xfer->prod );
914 		desc = &xfer->desc[xfer->cons];
915 		rmb();
916 		if ( desc->status & UHCI_STATUS_ACTIVE )
917 			break;
918 		control = le32_to_cpu ( desc->control );
919 		actual = le16_to_cpu ( desc->actual );
920 
921 		/* Update data length, if applicable */
922 		if ( UHCI_DATA_PACKET ( control ) )
923 			xfer->len += UHCI_ACTUAL_LEN ( actual );
924 
925 		/* If we have encountered an error, then deactivate
926 		 * the queue head (to prevent further hardware
927 		 * accesses to this transfer), consume the transfer,
928 		 * and report the error to the USB core.
929 		 */
930 		if ( desc->status & UHCI_STATUS_STALLED ) {
931 			DBGC ( uhci, "UHCI %s %s completion %d.%d failed "
932 			       "(status %02x)\n", usb->name,
933 			       usb_endpoint_name ( ep ), index,
934 			       xfer->cons, desc->status );
935 			link = UHCI_LINK_TERMINATE;
936 			ring->head->current = cpu_to_le32 ( link );
937 			wmb();
938 			iobuf = uhci_dequeue ( ring );
939 			usb_complete_err ( ep, iobuf, -EIO );
940 			break;
941 		}
942 
943 		/* Consume this descriptor */
944 		xfer->cons++;
945 
946 		/* Check for short packets */
947 		if ( UHCI_SHORT_PACKET ( control, actual ) ) {
948 
949 			/* Sanity checks */
950 			assert ( desc->flags & UHCI_FL_SPD );
951 			link = virt_to_phys ( desc );
952 			assert ( ( le32_to_cpu ( ring->head->current ) &
953 				   ~( UHCI_ALIGN - 1 ) ) == link );
954 
955 			/* If this is a message transfer, then restart
956 			 * at the status stage.
957 			 */
958 			if ( uhci_is_message ( xfer ) ) {
959 				xfer->cons = ( xfer->prod - 1 );
960 				link = virt_to_phys ( &xfer->desc[xfer->cons] );
961 				ring->head->current = cpu_to_le32 ( link );
962 				break;
963 			}
964 
965 			/* Otherwise, this is a stream transfer.
966 			 * First, prevent further hardware access to
967 			 * this transfer.
968 			 */
969 			link = UHCI_LINK_TERMINATE;
970 			ring->head->current = cpu_to_le32 ( link );
971 			wmb();
972 
973 			/* Determine expected data toggle for next descriptor */
974 			toggle = ( ( control ^ UHCI_CONTROL_TOGGLE ) &
975 				   UHCI_CONTROL_TOGGLE );
976 
977 			/* Consume this transfer */
978 			len = xfer->len;
979 			iobuf = uhci_dequeue ( ring );
980 
981 			/* Update packet length */
982 			assert ( len <= iob_len ( iobuf ) );
983 			iob_unput ( iobuf, ( iob_len ( iobuf ) - len ) );
984 
985 			/* Restart ring */
986 			uhci_restart ( ring, toggle );
987 
988 		} else if ( xfer->cons == xfer->prod ) {
989 
990 			/* Completed a transfer: consume it */
991 			len = xfer->len;
992 			iobuf = uhci_dequeue ( ring );
993 			assert ( len == iob_len ( iobuf ) );
994 
995 		} else {
996 
997 			/* Not a short packet and not yet complete:
998 			 * continue processing.
999 			 */
1000 			continue;
1001 		}
1002 
1003 		/* Report completion to USB core */
1004 		usb_complete ( ep, iobuf );
1005 	}
1006 }
1007 
1008 /******************************************************************************
1009  *
1010  * Device operations
1011  *
1012  ******************************************************************************
1013  */
1014 
1015 /**
1016  * Open device
1017  *
1018  * @v usb		USB device
1019  * @ret rc		Return status code
1020  */
uhci_device_open(struct usb_device * usb)1021 static int uhci_device_open ( struct usb_device *usb ) {
1022 	struct uhci_device *uhci = usb_bus_get_hostdata ( usb->port->hub->bus );
1023 
1024 	usb_set_hostdata ( usb, uhci );
1025 	return 0;
1026 }
1027 
1028 /**
1029  * Close device
1030  *
1031  * @v usb		USB device
1032  */
uhci_device_close(struct usb_device * usb)1033 static void uhci_device_close ( struct usb_device *usb ) {
1034 	struct uhci_device *uhci = usb_get_hostdata ( usb );
1035 	struct usb_bus *bus = uhci->bus;
1036 
1037 	/* Free device address, if assigned */
1038 	if ( usb->address )
1039 		usb_free_address ( bus, usb->address );
1040 }
1041 
1042 /**
1043  * Assign device address
1044  *
1045  * @v usb		USB device
1046  * @ret rc		Return status code
1047  */
uhci_device_address(struct usb_device * usb)1048 static int uhci_device_address ( struct usb_device *usb ) {
1049 	struct uhci_device *uhci = usb_get_hostdata ( usb );
1050 	struct usb_bus *bus = uhci->bus;
1051 	struct usb_endpoint *ep0 = usb_endpoint ( usb, USB_EP0_ADDRESS );
1052 	struct uhci_endpoint *endpoint0 = usb_endpoint_get_hostdata ( ep0 );
1053 	int address;
1054 	int rc;
1055 
1056 	/* Sanity checks */
1057 	assert ( usb->address == 0 );
1058 	assert ( ep0 != NULL );
1059 
1060 	/* Allocate device address */
1061 	address = usb_alloc_address ( bus );
1062 	if ( address < 0 ) {
1063 		rc = address;
1064 		DBGC ( uhci, "UHCI %s could not allocate address: %s\n",
1065 		       usb->name, strerror ( rc ) );
1066 		goto err_alloc_address;
1067 	}
1068 
1069 	/* Set address */
1070 	if ( ( rc = usb_set_address ( usb, address ) ) != 0 )
1071 		goto err_set_address;
1072 
1073 	/* Update device address */
1074 	usb->address = address;
1075 	endpoint0->ring.control |= UHCI_CONTROL_DEVICE ( address );
1076 
1077 	return 0;
1078 
1079  err_set_address:
1080 	usb_free_address ( bus, address );
1081  err_alloc_address:
1082 	return rc;
1083 }
1084 
1085 /******************************************************************************
1086  *
1087  * Hub operations
1088  *
1089  ******************************************************************************
1090  */
1091 
1092 /**
1093  * Open hub
1094  *
1095  * @v hub		USB hub
1096  * @ret rc		Return status code
1097  */
uhci_hub_open(struct usb_hub * hub __unused)1098 static int uhci_hub_open ( struct usb_hub *hub __unused ) {
1099 
1100 	/* Nothing to do */
1101 	return 0;
1102 }
1103 
1104 /**
1105  * Close hub
1106  *
1107  * @v hub		USB hub
1108  */
uhci_hub_close(struct usb_hub * hub __unused)1109 static void uhci_hub_close ( struct usb_hub *hub __unused ) {
1110 
1111 	/* Nothing to do */
1112 }
1113 
1114 /******************************************************************************
1115  *
1116  * Root hub operations
1117  *
1118  ******************************************************************************
1119  */
1120 
1121 /**
1122  * Open root hub
1123  *
1124  * @v hub		USB hub
1125  * @ret rc		Return status code
1126  */
uhci_root_open(struct usb_hub * hub)1127 static int uhci_root_open ( struct usb_hub *hub ) {
1128 	struct usb_bus *bus = hub->bus;
1129 	struct uhci_device *uhci = usb_bus_get_hostdata ( bus );
1130 
1131 	/* Record hub driver private data */
1132 	usb_hub_set_drvdata ( hub, uhci );
1133 
1134 	return 0;
1135 }
1136 
1137 /**
1138  * Close root hub
1139  *
1140  * @v hub		USB hub
1141  */
uhci_root_close(struct usb_hub * hub)1142 static void uhci_root_close ( struct usb_hub *hub ) {
1143 
1144 	/* Clear hub driver private data */
1145 	usb_hub_set_drvdata ( hub, NULL );
1146 }
1147 
1148 /**
1149  * Enable port
1150  *
1151  * @v hub		USB hub
1152  * @v port		USB port
1153  * @ret rc		Return status code
1154  */
uhci_root_enable(struct usb_hub * hub,struct usb_port * port)1155 static int uhci_root_enable ( struct usb_hub *hub, struct usb_port *port ) {
1156 	struct uhci_device *uhci = usb_hub_get_drvdata ( hub );
1157 	uint16_t portsc;
1158 	unsigned int i;
1159 
1160 	/* Reset port */
1161 	portsc = inw ( uhci->regs + UHCI_PORTSC ( port->address ) );
1162 	portsc |= UHCI_PORTSC_PR;
1163 	outw ( portsc, uhci->regs + UHCI_PORTSC ( port->address ) );
1164 	mdelay ( USB_RESET_DELAY_MS );
1165 	portsc &= ~UHCI_PORTSC_PR;
1166 	outw ( portsc, uhci->regs + UHCI_PORTSC ( port->address ) );
1167 	mdelay ( USB_RESET_RECOVER_DELAY_MS );
1168 
1169 	/* Enable port */
1170 	portsc |= UHCI_PORTSC_PED;
1171 	outw ( portsc, uhci->regs + UHCI_PORTSC ( port->address ) );
1172 	mdelay ( USB_RESET_RECOVER_DELAY_MS );
1173 
1174 	/* Wait for port to become enabled */
1175 	for ( i = 0 ; i < UHCI_PORT_ENABLE_MAX_WAIT_MS ; i++ ) {
1176 
1177 		/* Check port status */
1178 		portsc = inw ( uhci->regs + UHCI_PORTSC ( port->address ) );
1179 		if ( portsc & UHCI_PORTSC_PED )
1180 			return 0;
1181 
1182 		/* Delay */
1183 		mdelay ( 1 );
1184 	}
1185 
1186 	DBGC ( uhci, "UHCI %s-%d timed out waiting for port to enable "
1187 	       "(status %04x)\n",  uhci->name, port->address, portsc );
1188 	return -ETIMEDOUT;
1189 }
1190 
1191 /**
1192  * Disable port
1193  *
1194  * @v hub		USB hub
1195  * @v port		USB port
1196  * @ret rc		Return status code
1197  */
uhci_root_disable(struct usb_hub * hub,struct usb_port * port)1198 static int uhci_root_disable ( struct usb_hub *hub, struct usb_port *port ) {
1199 	struct uhci_device *uhci = usb_hub_get_drvdata ( hub );
1200 	uint16_t portsc;
1201 
1202 	/* Disable port */
1203 	portsc = inw ( uhci->regs + UHCI_PORTSC ( port->address ) );
1204 	portsc &= ~UHCI_PORTSC_PED;
1205 	outw ( portsc, uhci->regs + UHCI_PORTSC ( port->address ) );
1206 
1207 	return 0;
1208 }
1209 
1210 /**
1211  * Update root hub port speed
1212  *
1213  * @v hub		USB hub
1214  * @v port		USB port
1215  * @ret rc		Return status code
1216  */
uhci_root_speed(struct usb_hub * hub,struct usb_port * port)1217 static int uhci_root_speed ( struct usb_hub *hub, struct usb_port *port ) {
1218 	struct uhci_device *uhci = usb_hub_get_drvdata ( hub );
1219 	struct pci_device pci;
1220 	uint16_t portsc;
1221 	unsigned int speed;
1222 
1223 	/* Read port status */
1224 	portsc = inw ( uhci->regs + UHCI_PORTSC ( port->address ) );
1225 	if ( ! ( portsc & UHCI_PORTSC_CCS ) ) {
1226 		/* Port not connected */
1227 		speed = USB_SPEED_NONE;
1228 	} else if ( uhci->companion &&
1229 		    ! find_usb_bus_by_location ( BUS_TYPE_PCI,
1230 						 uhci->companion ) ) {
1231 		/* Defer connection detection until companion
1232 		 * controller has been enumerated.
1233 		 */
1234 		pci_init ( &pci, uhci->companion );
1235 		DBGC ( uhci, "UHCI %s-%d deferring for companion " PCI_FMT "\n",
1236 		       uhci->name, port->address, PCI_ARGS ( &pci ) );
1237 		speed = USB_SPEED_NONE;
1238 	} else if ( portsc & UHCI_PORTSC_LS ) {
1239 		/* Low-speed device */
1240 		speed = USB_SPEED_LOW;
1241 	} else {
1242 		/* Full-speed device */
1243 		speed = USB_SPEED_FULL;
1244 	}
1245 	port->speed = speed;
1246 
1247 	/* Record disconnections and clear changes */
1248 	port->disconnected |= ( portsc & UHCI_PORTSC_CSC );
1249 	outw ( portsc, uhci->regs + UHCI_PORTSC ( port->address ) );
1250 
1251 	return 0;
1252 }
1253 
1254 /**
1255  * Clear transaction translator buffer
1256  *
1257  * @v hub		USB hub
1258  * @v port		USB port
1259  * @v ep		USB endpoint
1260  * @ret rc		Return status code
1261  */
uhci_root_clear_tt(struct usb_hub * hub,struct usb_port * port,struct usb_endpoint * ep)1262 static int uhci_root_clear_tt ( struct usb_hub *hub, struct usb_port *port,
1263 				struct usb_endpoint *ep ) {
1264 	struct uhci_device *uhci = usb_hub_get_drvdata ( hub );
1265 
1266 	/* Should never be called; this is a root hub */
1267 	DBGC ( uhci, "UHCI %s-%d nonsensical CLEAR_TT for %s %s\n", uhci->name,
1268 	       port->address, ep->usb->name, usb_endpoint_name ( ep ) );
1269 
1270 	return -ENOTSUP;
1271 }
1272 
1273 /**
1274  * Poll for port status changes
1275  *
1276  * @v hub		USB hub
1277  * @v port		USB port
1278  */
uhci_root_poll(struct usb_hub * hub,struct usb_port * port)1279 static void uhci_root_poll ( struct usb_hub *hub, struct usb_port *port ) {
1280 	struct uhci_device *uhci = usb_hub_get_drvdata ( hub );
1281 	uint16_t portsc;
1282 	uint16_t change;
1283 
1284 	/* Do nothing unless something has changed */
1285 	portsc = inw ( uhci->regs + UHCI_PORTSC ( port->address ) );
1286 	change = ( portsc & UHCI_PORTSC_CHANGE );
1287 	if ( ! change )
1288 		return;
1289 
1290 	/* Record disconnections and clear changes */
1291 	port->disconnected |= ( portsc & UHCI_PORTSC_CSC );
1292 	outw ( portsc, uhci->regs + UHCI_PORTSC ( port->address ) );
1293 
1294 	/* Report port status change */
1295 	usb_port_changed ( port );
1296 }
1297 
1298 /******************************************************************************
1299  *
1300  * Bus operations
1301  *
1302  ******************************************************************************
1303  */
1304 
1305 /**
1306  * Open USB bus
1307  *
1308  * @v bus		USB bus
1309  * @ret rc		Return status code
1310  */
uhci_bus_open(struct usb_bus * bus)1311 static int uhci_bus_open ( struct usb_bus *bus ) {
1312 	struct uhci_device *uhci = usb_bus_get_hostdata ( bus );
1313 	int rc;
1314 
1315 	/* Sanity checks */
1316 	assert ( list_empty ( &uhci->async ) );
1317 	assert ( list_empty ( &uhci->periodic ) );
1318 
1319 	/* Allocate and initialise asynchronous queue head */
1320 	uhci->head = malloc_dma ( sizeof ( *uhci->head ), UHCI_ALIGN );
1321 	if ( ! uhci->head ) {
1322 		rc = -ENOMEM;
1323 		goto err_alloc_head;
1324 	}
1325 	if ( ( rc = uhci_reachable ( uhci->head, sizeof ( *uhci->head ) ) ) !=0)
1326 		goto err_unreachable_head;
1327 	memset ( uhci->head, 0, sizeof ( *uhci->head ) );
1328 	uhci->head->current = cpu_to_le32 ( UHCI_LINK_TERMINATE );
1329 	uhci_async_schedule ( uhci );
1330 
1331 	/* Allocate periodic frame list */
1332 	uhci->frame = malloc_dma ( sizeof ( *uhci->frame ),
1333 				   sizeof ( *uhci->frame ) );
1334 	if ( ! uhci->frame ) {
1335 		rc = -ENOMEM;
1336 		goto err_alloc_frame;
1337 	}
1338 	if ( ( rc = uhci_reachable ( uhci->frame,
1339 				     sizeof ( *uhci->frame ) ) ) != 0 )
1340 		goto err_unreachable_frame;
1341 	uhci_periodic_schedule ( uhci );
1342 	outl ( virt_to_phys ( uhci->frame ), uhci->regs + UHCI_FLBASEADD );
1343 
1344 	/* Start controller */
1345 	uhci_run ( uhci );
1346 
1347 	return 0;
1348 
1349 	uhci_stop ( uhci );
1350  err_unreachable_frame:
1351 	free_dma ( uhci->frame, sizeof ( *uhci->frame ) );
1352  err_alloc_frame:
1353  err_unreachable_head:
1354 	free_dma ( uhci->head, sizeof ( *uhci->head ) );
1355  err_alloc_head:
1356 	return rc;
1357 }
1358 
1359 /**
1360  * Close USB bus
1361  *
1362  * @v bus		USB bus
1363  */
uhci_bus_close(struct usb_bus * bus)1364 static void uhci_bus_close ( struct usb_bus *bus ) {
1365 	struct uhci_device *uhci = usb_bus_get_hostdata ( bus );
1366 
1367 	/* Sanity checks */
1368 	assert ( list_empty ( &uhci->async ) );
1369 	assert ( list_empty ( &uhci->periodic ) );
1370 
1371 	/* Stop controller */
1372 	uhci_stop ( uhci );
1373 
1374 	/* Free periodic frame list */
1375 	free_dma ( uhci->frame, sizeof ( *uhci->frame ) );
1376 
1377 	/* Free asynchronous schedule */
1378 	free_dma ( uhci->head, sizeof ( *uhci->head ) );
1379 }
1380 
1381 /**
1382  * Poll USB bus
1383  *
1384  * @v bus		USB bus
1385  */
uhci_bus_poll(struct usb_bus * bus)1386 static void uhci_bus_poll ( struct usb_bus *bus ) {
1387 	struct uhci_device *uhci = usb_bus_get_hostdata ( bus );
1388 	struct usb_hub *hub = bus->hub;
1389 	struct uhci_endpoint *endpoint;
1390 	unsigned int i;
1391 
1392 	/* UHCI defers interrupts (including short packet detection)
1393 	 * until the end of the frame.  This can result in bulk IN
1394 	 * endpoints remaining halted for much of the time, waiting
1395 	 * for software action to reset the data toggles.  We
1396 	 * therefore ignore USBSTS and unconditionally poll all
1397 	 * endpoints for completed transfer descriptors.
1398 	 *
1399 	 * As with EHCI, we trust that completion handlers are minimal
1400 	 * and will not do anything that could plausibly affect the
1401 	 * endpoint list itself.
1402 	 */
1403 	list_for_each_entry ( endpoint, &uhci->endpoints, list )
1404 		uhci_endpoint_poll ( endpoint );
1405 
1406 	/* UHCI provides no single bit to indicate that a port status
1407 	 * change has occurred.  We therefore unconditionally iterate
1408 	 * over all ports looking for status changes.
1409 	 */
1410 	for ( i = 1 ; i <= UHCI_PORTS ; i++ )
1411 		uhci_root_poll ( hub, usb_port ( hub, i ) );
1412 }
1413 
1414 /******************************************************************************
1415  *
1416  * PCI interface
1417  *
1418  ******************************************************************************
1419  */
1420 
1421 /** USB host controller operations */
1422 static struct usb_host_operations uhci_operations = {
1423 	.endpoint = {
1424 		.open = uhci_endpoint_open,
1425 		.close = uhci_endpoint_close,
1426 		.reset = uhci_endpoint_reset,
1427 		.mtu = uhci_endpoint_mtu,
1428 		.message = uhci_endpoint_message,
1429 		.stream = uhci_endpoint_stream,
1430 	},
1431 	.device = {
1432 		.open = uhci_device_open,
1433 		.close = uhci_device_close,
1434 		.address = uhci_device_address,
1435 	},
1436 	.bus = {
1437 		.open = uhci_bus_open,
1438 		.close = uhci_bus_close,
1439 		.poll = uhci_bus_poll,
1440 	},
1441 	.hub = {
1442 		.open = uhci_hub_open,
1443 		.close = uhci_hub_close,
1444 	},
1445 	.root = {
1446 		.open = uhci_root_open,
1447 		.close = uhci_root_close,
1448 		.enable = uhci_root_enable,
1449 		.disable = uhci_root_disable,
1450 		.speed = uhci_root_speed,
1451 		.clear_tt = uhci_root_clear_tt,
1452 	},
1453 };
1454 
1455 /**
1456  * Locate EHCI companion controller (when no EHCI support is present)
1457  *
1458  * @v pci		PCI device
1459  * @ret busdevfn	EHCI companion controller bus:dev.fn (if any)
1460  */
ehci_companion(struct pci_device * pci __unused)1461 __weak unsigned int ehci_companion ( struct pci_device *pci __unused ) {
1462 	return 0;
1463 }
1464 
1465 /**
1466  * Probe PCI device
1467  *
1468  * @v pci		PCI device
1469  * @ret rc		Return status code
1470  */
uhci_probe(struct pci_device * pci)1471 static int uhci_probe ( struct pci_device *pci ) {
1472 	struct uhci_device *uhci;
1473 	struct usb_port *port;
1474 	unsigned int i;
1475 	int rc;
1476 
1477 	/* Allocate and initialise structure */
1478 	uhci = zalloc ( sizeof ( *uhci ) );
1479 	if ( ! uhci ) {
1480 		rc = -ENOMEM;
1481 		goto err_alloc;
1482 	}
1483 	uhci->name = pci->dev.name;
1484 	INIT_LIST_HEAD ( &uhci->endpoints );
1485 	INIT_LIST_HEAD ( &uhci->async );
1486 	INIT_LIST_HEAD ( &uhci->periodic );
1487 
1488 	/* Fix up PCI device */
1489 	adjust_pci_device ( pci );
1490 
1491 	/* Identify EHCI companion controller, if any */
1492 	uhci->companion = ehci_companion ( pci );
1493 
1494 	/* Claim ownership from BIOS.  (There is no release mechanism
1495 	 * for UHCI.)
1496 	 */
1497 	pci_write_config_word ( pci, UHCI_USBLEGSUP, UHCI_USBLEGSUP_DEFAULT );
1498 
1499 	/* Map registers */
1500 	uhci->regs = pci->ioaddr;
1501 	if ( ! uhci->regs ) {
1502 		rc = -ENODEV;
1503 		goto err_ioremap;
1504 	}
1505 
1506 	/* Reset device */
1507 	if ( ( rc = uhci_reset ( uhci ) ) != 0 )
1508 		goto err_reset;
1509 
1510 	/* Allocate USB bus */
1511 	uhci->bus = alloc_usb_bus ( &pci->dev, UHCI_PORTS, UHCI_MTU,
1512 				    &uhci_operations );
1513 	if ( ! uhci->bus ) {
1514 		rc = -ENOMEM;
1515 		goto err_alloc_bus;
1516 	}
1517 	usb_bus_set_hostdata ( uhci->bus, uhci );
1518 	usb_hub_set_drvdata ( uhci->bus->hub, uhci );
1519 
1520 	/* Set port protocols */
1521 	for ( i = 1 ; i <= UHCI_PORTS ; i++ ) {
1522 		port = usb_port ( uhci->bus->hub, i );
1523 		port->protocol = USB_PROTO_2_0;
1524 	}
1525 
1526 	/* Register USB bus */
1527 	if ( ( rc = register_usb_bus ( uhci->bus ) ) != 0 )
1528 		goto err_register;
1529 
1530 	pci_set_drvdata ( pci, uhci );
1531 	return 0;
1532 
1533 	unregister_usb_bus ( uhci->bus );
1534  err_register:
1535 	free_usb_bus ( uhci->bus );
1536  err_alloc_bus:
1537 	uhci_reset ( uhci );
1538  err_reset:
1539  err_ioremap:
1540 	free ( uhci );
1541  err_alloc:
1542 	return rc;
1543 }
1544 
1545 /**
1546  * Remove PCI device
1547  *
1548  * @v pci		PCI device
1549  */
uhci_remove(struct pci_device * pci)1550 static void uhci_remove ( struct pci_device *pci ) {
1551 	struct uhci_device *uhci = pci_get_drvdata ( pci );
1552 	struct usb_bus *bus = uhci->bus;
1553 
1554 	unregister_usb_bus ( bus );
1555 	assert ( list_empty ( &uhci->async ) );
1556 	assert ( list_empty ( &uhci->periodic ) );
1557 	free_usb_bus ( bus );
1558 	uhci_reset ( uhci );
1559 	free ( uhci );
1560 }
1561 
1562 /** UHCI PCI device IDs */
1563 static struct pci_device_id uhci_ids[] = {
1564 	PCI_ROM ( 0xffff, 0xffff, "uhci", "UHCI", 0 ),
1565 };
1566 
1567 /** UHCI PCI driver */
1568 struct pci_driver uhci_driver __pci_driver = {
1569 	.ids = uhci_ids,
1570 	.id_count = ( sizeof ( uhci_ids ) / sizeof ( uhci_ids[0] ) ),
1571 	.class = PCI_CLASS_ID ( PCI_CLASS_SERIAL, PCI_CLASS_SERIAL_USB,
1572 				PCI_CLASS_SERIAL_USB_UHCI ),
1573 	.probe = uhci_probe,
1574 	.remove = uhci_remove,
1575 };
1576