Hi Vignesh,

On 16/11/17 14:26, Vignesh R wrote:
> +linux-pci
> 
> Hi Chris,
> 
> On Thursday 16 November 2017 05:20 PM, Quadros, Roger wrote:
>> +Vignesh
>>
>> On 13/09/17 17:26, Chris Welch wrote:
>>> We are developing a product based on the TI AM5728 EVM.  The product 
>>> utilizes a TUSB7340 PCIe USB host for additional ports.  The TUSB7340 is 
>>> detected and setup properly and works OK with low data rate devices.  
>>> However, hot plugging a Realtek USB network adapter and doing Ethernet 
>>> transfer bandwidth testing using iperf3 causes the TUSB7340 host to be  
>>> locked out.  The TUSB7340 host appears to no longer communicate and the 
>>> logging indicates xhci_hcd 0000:01:00.0: HC died; cleaning up.  Same issue 
>>> occurs with another USB Ethernet adapter I tried (Asus).
>>>
>>> We looked at using another host and found a mini PCIe card that utilizes 
>>> the µPD720201 and can be directly installed on the TI AM5728 EVM.  The card 
>>> is detected properly and we reran the transfer test.  The uPD720201 gets 
>>> locks out with the same problem.
>>>
>>> The AM5728 testing was performed using the TI SD card stock 
>>> am57xx-evm-linux-04.00.00.04.img, kernel am57xx-evm 4.9.28-geed43d1050, and 
>>> it reports that it is using the TI AM572x EVM Rev A3 device tree.
>>>
>>> It shows the following logging when it fails (this is with the TI EVM and 
>>> uPD720201).
>>>
>>> [  630.400899] xhci_hcd 0000:01:00.0: xHCI host not responding to stop 
>>> endpoint command.
>>> [  630.408769] xhci_hcd 0000:01:00.0: Assuming host is dying, halting host.
>>> [  630.420849] r8152 2-4:1.0 enp1s0u4: Tx status -108
>>> [  630.425667] r8152 2-4:1.0 enp1s0u4: Tx status -108
>>> [  630.430483] r8152 2-4:1.0 enp1s0u4: Tx status -108
>>> [  630.435297] r8152 2-4:1.0 enp1s0u4: Tx status -108
>>> [  630.440122] xhci_hcd 0000:01:00.0: HC died; cleaning up
>>> [  630.453961] usb 2-4: USB disconnect, device number 2
>>>
>>> The problem appears to be a general driver issue given we get the same 
>>> problem with both the  TUSB7340 and the µPD720201.
> 
> Seems like PCIe driver is missing MSI IRQs leading to stall. 
> Reading xHCI registers via PCIe mem space confirms this.
> 
> I see two problems wrt MSI handling:
> Since commit 8c934095fa2f3 ("PCI: dwc: Clear MSI interrupt status after it is 
> handled, not before"),
> dwc clears MSI status after calling EP's IRQ handler. But, it happens that 
> another MSI interrupt is
> raised just at the end of EP's IRQ handler and before clearing MSI status.
> This will result in loss of new MSI IRQ as we clear the MSI IRQ status 
> without handling.
> 
> Another problem appears to be wrt dra7xx PCIe wrapper:
> PCIECTRL_DRA7XX_CONF_IRQSTATUS_MSI does not seem to catch MSI IRQs unless,
> its ensured that PCIE_MSI_INTR0_STATUS register read returns 0.
> 
> So, could you try reverting commit 8c934095fa2f3 and 
> also apply below patch and let me know if that fixes the issue?
> 
> -----------
> 
> diff --git a/drivers/pci/dwc/pci-dra7xx.c b/drivers/pci/dwc/pci-dra7xx.c
> index e77a4ceed74c..8280abc56f30 100644
> --- a/drivers/pci/dwc/pci-dra7xx.c
> +++ b/drivers/pci/dwc/pci-dra7xx.c
> @@ -259,10 +259,17 @@ static irqreturn_t dra7xx_pcie_msi_irq_handler(int irq, 
> void *arg)
>         u32 reg;
>  
>         reg = dra7xx_pcie_readl(dra7xx, PCIECTRL_DRA7XX_CONF_IRQSTATUS_MSI);
> +       dra7xx_pcie_writel(dra7xx, PCIECTRL_DRA7XX_CONF_IRQSTATUS_MSI, reg);
>  
>         switch (reg) {
>         case MSI:
> -               dw_handle_msi_irq(pp);
> +               /*
> +                * Need to make sure no MSI IRQs are pending before
> +                * exiting handler, else the wrapper will not catch new
> +                * IRQs. So loop around till dw_handle_msi_irq() returns
> +                * IRQ_NONE
> +                */
> +               while (dw_handle_msi_irq(pp) != IRQ_NONE);

To avoid this kind of looping, shouldn't we be disabling all IRQ events while
the interrupt handler is running and enable them just before we return from the 
hardirq
handler?


>                 break;
>         case INTA:
>         case INTB:
> @@ -273,8 +280,6 @@ static irqreturn_t dra7xx_pcie_msi_irq_handler(int irq, 
> void *arg)
>                 break;
>         }
>  
> -       dra7xx_pcie_writel(dra7xx, PCIECTRL_DRA7XX_CONF_IRQSTATUS_MSI, reg);
> -
>         return IRQ_HANDLED;
>  }
> 
> 
> 
> 

-- 
cheers,
-roger

Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki. 
Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to