Message ID | 1458745223.1850.6.camel@altera.com |
---|---|
State | Not Applicable |
Headers | show |
Hi Chin, On 23.03.2016 16:00, Chin Liang See wrote: > On Mon, 2016-03-21 at 23:45 +0800, Chin Liang See wrote: >> On Mon, 2016-03-21 at 22:05 +0800, Chin Liang See wrote: >>> On Fri, 2016-03-04 at 20:03 +0100, Marek Vasut wrote: >>>> On 03/04/2016 05:06 PM, Dinh Nguyen wrote: >>>>> On 03/02/2016 05:24 PM, Marek Vasut wrote: > > [..] > >>>>>> Well, that's our usual USB/QSPI cache issue that's tormenting >>>>>> your soul. >>>>>> CCing Chin ;-) >>>>>> >>>>>> Does the issue by any chance magically disappear if you apply >>>>>> this patch: >>>>>> >>>>>> diff --git a/arch/arm/include/asm/system.h >>>>>> b/arch/arm/include/asm/system.h >>>>>> index 026e7ef..06802c6 100644 >>>>>> --- a/arch/arm/include/asm/system.h >>>>>> +++ b/arch/arm/include/asm/system.h >>>>>> @@ -274,7 +274,7 @@ static inline void set_dacr(unsigned int >>>>>> val) >>>>>> >>>>>> /* options available for data cache on each page */ >>>>>> enum dcache_option { >>>>>> - DCACHE_OFF = TTB_SECT_DOMAIN(0) | TTB_SECT_XN_MASK | >>>>>> TTB_SECT, >>>>>> + DCACHE_OFF = TTB_SECT_S_MASK | TTB_SECT_DOMAIN(0) | >>>>>> TTB_SECT_XN_MASK | TTB_SECT, >>>>>> DCACHE_WRITETHROUGH = DCACHE_OFF | TTB_SECT_C_MASK, >>>>>> DCACHE_WRITEBACK = DCACHE_WRITETHROUGH | >>>>>> TTB_SECT_B_MASK, >>>>>> DCACHE_WRITEALLOC = DCACHE_WRITEBACK | >>>>>> TTB_SECT_TEX(1), >>>>>> >>>>> >>>>> Yes, this patch fixes USB with dcache left on. >>>> >>>> Except that it doesn't fix anything, it just makes the system >>>> slower >>>> by >>>> setting the S bit :-/ So this is not a fix :-( >>> >>> Sorry for away for a while as busy with some critical issues. >>> >>> Finally relooking back on this. I notice that with SanDisk Cruzer >>> Blade >>> pendrive, U-Boot 2013.01.01 can detect it while latest cannot. The >>> dcache disablement at latest U-Boot doesn't help. >>> >>> With that, I compared a bunch of registers from clocks, sysmgr, >>> SCTLR, >>> ATCLR and USB1 too. I noticed they are similar except the >>> usb1.globgrp.gusbcfg.ulpiextvbusdrv. The latest U-Boot is >>> indicating >>> external supply (address 0xffb4000c return value 0x00101710) while >>> working 2013.01.01 indicating internal charge pump (return value >>> 0x00001710) >>> >>> Wonder you guys are seeing the same too? Will dig more about this. >>> FYI, >>> I tried to add lot of delay within dwc2.c but doesn't help at all. >>> >> >> While modifying the USB power control of the code, I noticed the >> patch >> made by Dinh is not there. Just realize the git clone through http >> from >> main git doesn't work. I was able to clone but getting older version. >> >> With getting the latest code, all my pendrive now can works with >> dcache >> off. Its easier now as I can get consistent behaviour compared >> previously. With that, dcache investigation for tomorrow then >> >> Thanks >> Chin Liang >> > > Spent more time on the dcache + USB issue today. Narrow down to below > patch which can make all my USB pendrives work with dcache enabled. But > still need to understand further as not in depth familiar with dwc2. > Probably this might ring a bell to you guys? > > > diff --git a/drivers/usb/host/dwc2.c b/drivers/usb/host/dwc2.c > index b2f4bc6..b11d8d7 100644 > --- a/drivers/usb/host/dwc2.c > +++ b/drivers/usb/host/dwc2.c > @@ -776,6 +776,7 @@ static int transfer_chunk(struct dwc2_hc_regs > *hc_regs, void *aligned_buffer, > (num_packets << DWC2_HCTSIZ_PKTCNT_OFFSET) | > (*pid << DWC2_HCTSIZ_PID_OFFSET), > &hc_regs->hctsiz); > + udelay(2); > > if (!in && xfer_len) { > memcpy(aligned_buffer, buffer, xfer_len); I can't really comment on the USB problem, as I've only seen this d-cache / S-bit problem with SPI NOR flash. This is because I've never really used USB on this platform intensively. But I'm nearly 100% sure, that all changes that add some delays (or debug printfs) resulting in a "working solution", either in the USB case or the SPI NOR case, are just papering over the real problem. Thanks, Stefan
diff --git a/drivers/usb/host/dwc2.c b/drivers/usb/host/dwc2.c index b2f4bc6..b11d8d7 100644 --- a/drivers/usb/host/dwc2.c +++ b/drivers/usb/host/dwc2.c @@ -776,6 +776,7 @@ static int transfer_chunk(struct dwc2_hc_regs *hc_regs, void *aligned_buffer, (num_packets << DWC2_HCTSIZ_PKTCNT_OFFSET) | (*pid << DWC2_HCTSIZ_PID_OFFSET), &hc_regs->hctsiz); + udelay(2); if (!in && xfer_len) {