On Tue, Nov 05, 2024 at 02:48:50PM +0530, Raju Rangoju wrote: > During the High-Speed Isochronous Audio transfers, xHCI > controller on certain AMD platforms experiences momentary data > loss. This results in Missed Service Errors (MSE) being > generated by the xHCI. > > The root cause of the MSE is attributed to the ISOC OUT endpoint > being omitted from scheduling. This can happen either when an IN > endpoint with a 64ms service interval is pre-scheduled prior to > the ISOC OUT endpoint or when the interval of the ISOC OUT > endpoint is shorter than that of the IN endpoint. Consequently, > the OUT service is neglected when an IN endpoint with a service > interval exceeding 32ms is scheduled concurrently (every 64ms in > this scenario). > > This issue is particularly seen on certain older AMD platforms. > To mitigate this problem, it is recommended to adjust the service > interval of the IN endpoint to exceed 32ms (interval 8). This > adjustment ensures that the OUT endpoint will not be bypassed, > even if a smaller interval value is utilized. > > Cc: stable@xxxxxxxxxxxxxxx > Signed-off-by: Raju Rangoju <Raju.Rangoju@xxxxxxx> > --- > drivers/usb/host/xhci-mem.c | 5 +++++ > drivers/usb/host/xhci-pci.c | 14 ++++++++++++++ > drivers/usb/host/xhci.h | 1 + > 3 files changed, 20 insertions(+) > > diff --git a/drivers/usb/host/xhci-mem.c b/drivers/usb/host/xhci-mem.c > index d2900197a49e..4892bb9afa6e 100644 > --- a/drivers/usb/host/xhci-mem.c > +++ b/drivers/usb/host/xhci-mem.c > @@ -1426,6 +1426,11 @@ int xhci_endpoint_init(struct xhci_hcd *xhci, > /* Periodic endpoint bInterval limit quirk */ > if (usb_endpoint_xfer_int(&ep->desc) || > usb_endpoint_xfer_isoc(&ep->desc)) { > + if ((xhci->quirks & XHCI_LIMIT_ENDPOINT_INTERVAL_9) && > + usb_endpoint_xfer_int(&ep->desc) && > + interval >= 9) { > + interval = 8; > + } > if ((xhci->quirks & XHCI_LIMIT_ENDPOINT_INTERVAL_7) && > udev->speed >= USB_SPEED_HIGH && > interval >= 7) { > diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c > index cb07cee9ed0c..a078e2e5517d 100644 > --- a/drivers/usb/host/xhci-pci.c > +++ b/drivers/usb/host/xhci-pci.c > @@ -284,6 +284,20 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci) > if (pdev->vendor == PCI_VENDOR_ID_NEC) > xhci->quirks |= XHCI_NEC_HOST; > > + if (pdev->vendor == PCI_VENDOR_ID_AMD && > + (pdev->device == 0x13ed || > + pdev->device == 0x13ee || > + pdev->device == 0x148c || > + pdev->device == 0x15d4 || > + pdev->device == 0x15d5 || > + pdev->device == 0x15e0 || > + pdev->device == 0x15e1 || > + pdev->device == 0x15e5)) Any need/want to name these pci devices with something we can refer to other than a hex value? thanks, greg k-h