On Tuesday 21 November 2017 08:20 PM, Chris Welch wrote:
> 
> 
>> -----Original Message-----
>> From: Vignesh R [mailto:vigne...@ti.com]
>> Sent: Tuesday, November 21, 2017 12:48 AM
>> To: Roger Quadros <rog...@ti.com>
>> Cc: Chris Welch <chris.we...@viavisolutions.com>; linux-usb@vger.kernel.org;
>> linux-...@vger.kernel.org; Joao Pinto <jpi...@synopsys.com>; KISHON VIJAY
>> ABRAHAM <kis...@ti.com>
>> Subject: Re: xhci_hcd HC died; cleaning up with TUSB7340 and µPD720201
>>
>>
>>
>> On Monday 20 November 2017 07:01 PM, Roger Quadros wrote:
>>> On 20/11/17 15:19, Vignesh R wrote:
>>>>
>>>>
>>>> On Monday 20 November 2017 01:31 PM, Roger Quadros wrote:
>>>> [...]
>>>>>>
>>>>>> 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);
> 
> The patch looks good, I haven't had a failure in a few days of testing.  

Thanks for testing! I will submit patches formally with some minor tweaks.

> 
> You should also look at incorporating the following that I needed to change 
> to get our product working.  The first change fixes a miss by one error with 
> the interrupt lines.  

Yeah, this is a known issue and has been discussed[1] before. We are
exploring better solution

> 
> The second change extends a patch you developed for errata i870 but we found 
> is applicable to RC operation as well as EPs.  Thanks very much for your help!

Thanks for pointing that out, will submit a patch for errata workaround.

[1] https://lkml.org/lkml/2016/9/14/241

Regards
Vignesh
> 
> diff --git a/drivers/pci/dwc/pci-dra7xx.c b/drivers/pci/dwc/pci-dra7xx.c
> old mode 100644
> new mode 100755
> index defa272..6245d89
> --- a/drivers/pci/dwc/pci-dra7xx.c
> +++ b/drivers/pci/dwc/pci-dra7xx.c
> @@ -238,8 +238,8 @@ static int dra7xx_pcie_init_irq_domain(struct pcie_port 
> *pp)
>                 dev_err(dev, "No PCIe Intc node found\n");
>                 return -ENODEV;
>         }
> -
> -       dra7xx->irq_domain = irq_domain_add_linear(pcie_intc_node, 4,
> +        // PCI interrupt lines start at 1 not zero so need to add 1
> +       dra7xx->irq_domain = irq_domain_add_linear(pcie_intc_node, 4 + 1,
>                                                    &intx_domain_ops, pp);
>         if (!dra7xx->irq_domain) {
>                 dev_err(dev, "Failed to get a INTx IRQ domain\n");
> @@ -706,10 +706,16 @@ static int __init dra7xx_pcie_probe(struct 
> platform_device *pdev)
>                 dra7xx_pcie_writel(dra7xx, PCIECTRL_TI_CONF_DEVICE_TYPE,
>                                    DEVICE_TYPE_RC);
>  
> +               // Errata i870 applies to RC as well as EP
> +               ret = dra7xx_pcie_ep_legacy_mode(dev);
> +               if (ret)
> +                       goto err_gpio;
> +
>                 ret = dra7xx_add_pcie_port(dra7xx, pdev);
>                 if (ret < 0)
>                         goto err_gpio;
>                 break;
> 
> 
>>>>>
>>>>> 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?
>>>>
>>>> IIUC, you are saying to disable all MSIs at PCIe designware core
>>>> level, then call dw_handle_msi_irq() and then enable MSIs after
>>>> hardirq returns. But, the problem is if PCIe EP raises another MSI
>>>> after the call to EP's handler but before re-enabling MSIs, then it
>>>> will be ignored as IRQs are not yet enabled.
>>>> Ideally, EP's support Per Vector Masking(PVM) which allow RC to
>>>> prevent EP from sending MSI messages for sometime. But,
>>>> unfortunately, the cards mentioned here don't support this feature.
>>>
>>> I'm not aware of MSIs.
>>>
>>> But for any typical hardware, there should be an interrupt event
>>> enable register and an interrupt mask register.
>>>
>>> In the IRQ handler, we mask the interrupt but still keep the interrupt
>>> events enabled so that they can be latched during the time the interrupt was
>> masked.
>>>
>>> When the interrupt is unmasked at end of the IRQ handler, it should
>>> re-trigger the interrupt if any events were latched and pending.
>>>
>>> This way you don't need to keep checking for any pending events in the IRQ
>> handler.
>>>
>>
>> Thanks for the suggestion! I tried using interrupt masking at designware 
>> level.
>> But, unfortunately that does not help and my test cases still fail.
>> Seems like designware MSI status register is a non-masked status and dra7xx
>> specific wrapper seems to be relying on this non-masked status to raise
>> IRQ(instead of actual IRQ signal of designware) to CPU. There is very little
>> documentation in the TRM wrt how wrapper forwards designware IRQ status to
>> CPU.
>>
>> So, at best, I will add a check in the above while() loop and break and exit 
>> IRQ
>> handler, lets say after 1K loops.
>>
>>
>> --
>> Regards
>> Vignesh

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to