Print this page
NEX-16600 "No SOF interrupts have been received" on HPE ProLiant DL380 Gen10, leading to non-working USB EHCI controller
Reviewed by: Evan Layton <evan.layton@nexenta.com>
Reviewed by: Roman Strashkin <roman.strashkin@nexenta.com>
Reviewed by: Rick McNeal <rick.mcneal@nexenta.com>

Split Close
Expand all
Collapse all
          --- old/usr/src/uts/common/io/usb/hcd/ehci/ehci.c
          +++ new/usr/src/uts/common/io/usb/hcd/ehci/ehci.c
↓ open down ↓ 10 lines elided ↑ open up ↑
  11   11   * and limitations under the License.
  12   12   *
  13   13   * When distributing Covered Code, include this CDDL HEADER in each
  14   14   * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15   15   * If applicable, add the following below this CDDL HEADER, with the
  16   16   * fields enclosed by brackets "[]" replaced with your own identifying
  17   17   * information: Portions Copyright [yyyy] [name of copyright owner]
  18   18   *
  19   19   * CDDL HEADER END
  20   20   */
       21 +
  21   22  /*
  22   23   * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
  23   24   * Use is subject to license terms.
  24   25   */
  25   26  
       27 +/*
       28 + * Copyright 2018 Nexenta Systems, Inc.
       29 + */
  26   30  
  27   31  /*
  28   32   * EHCI Host Controller Driver (EHCI)
  29   33   *
  30   34   * The EHCI driver is a software driver which interfaces to the Universal
  31   35   * Serial Bus layer (USBA) and the Host Controller (HC). The interface to
  32   36   * the Host Controller is defined by the EHCI Host Controller Interface.
  33   37   *
  34   38   * This file contains code for Auto-configuration and HCDI entry points.
  35   39   *
↓ open down ↓ 652 lines elided ↑ open up ↑
 688  692  
 689  693          if (ehcip->ehci_hc_soft_state == EHCI_CTLR_ERROR_STATE) {
 690  694                  mutex_exit(&ehcip->ehci_int_mutex);
 691  695  
 692  696                  return (DDI_INTR_CLAIMED);
 693  697          }
 694  698  
 695  699          USB_DPRINTF_L3(PRINT_MASK_INTR, ehcip->ehci_log_hdl,
 696  700              "Interrupt status 0x%x", intr);
 697  701  
 698      -        /*
 699      -         * If necessary broadcast that an interrupt has occured.  This
 700      -         * is only necessary during controller init.
 701      -         */
 702      -        if (ehcip->ehci_flags & EHCI_CV_INTR) {
 703      -                ehcip->ehci_flags &= ~EHCI_CV_INTR;
 704      -                cv_broadcast(&ehcip->ehci_async_schedule_advance_cv);
 705      -        }
 706      -
 707  702          /* Check for Frame List Rollover */
 708  703          if (intr & EHCI_INTR_FRAME_LIST_ROLLOVER) {
 709  704                  USB_DPRINTF_L3(PRINT_MASK_INTR, ehcip->ehci_log_hdl,
 710  705                      "ehci_intr: Frame List Rollover");
 711  706  
 712  707                  ehci_handle_frame_list_rollover(ehcip);
 713  708  
 714  709                  /* VIA VT6202 looses EHCI_INTR_USB interrupts, workaround. */
 715  710                  if ((ehcip->ehci_vendor_id == PCI_VENDOR_VIA) &&
 716  711                      (ehci_vt62x2_workaround & EHCI_VIA_LOST_INTERRUPTS)) {
↓ open down ↓ 2 lines elided ↑ open up ↑
 719  714          }
 720  715  
 721  716          /* Check for Advance on Asynchronous Schedule */
 722  717          if (intr & EHCI_INTR_ASYNC_ADVANCE) {
 723  718                  USB_DPRINTF_L3(PRINT_MASK_INTR, ehcip->ehci_log_hdl,
 724  719                      "ehci_intr: Asynchronous Schedule Advance Notification");
 725  720  
 726  721                  /* Disable async list advance interrupt */
 727  722                  Set_OpReg(ehci_interrupt,
 728  723                      (Get_OpReg(ehci_interrupt) & ~EHCI_INTR_ASYNC_ADVANCE));
 729      -
 730      -                /*
 731      -                 * Call cv_broadcast on every this interrupt to wakeup
 732      -                 * all the threads that are waiting the async list advance
 733      -                 * event.
 734      -                 */
 735      -                cv_broadcast(&ehcip->ehci_async_schedule_advance_cv);
 736  724          }
 737  725  
 738  726          /* Always process completed itds */
 739  727          ehci_traverse_active_isoc_list(ehcip);
 740  728  
 741  729          /*
 742  730           * Check for any USB transaction completion notification. Also
 743  731           * process any missed USB transaction completion interrupts.
 744  732           */
 745  733          if ((intr & EHCI_INTR_USB) || (intr & EHCI_INTR_USB_ERROR) ||
↓ open down ↓ 832 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX