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