fwochi.c and bus_space_barrier()

Andreas Tobler andreast-list at fgznet.ch
Thu Apr 16 20:21:06 UTC 2009


Sean Bruno wrote:
>>> You may want to retry several times.  Like you pointed out in earlier
>>> posts, this issue seems to be a race condition.
>> Heh, now I remember, I did not speak about a race condition, but about a 
>> timing issue.
>>
>> If I leave the printfs away, it panics here.
>>
>> for (lps = 0, lps_counter = 0; !lps && lps_counter < 3; lps_counter++) {
>>                  lps = (OREAD(sc, OHCI_HCCCTL) & OHCI_HCC_LPS);
>>                  if (!lps) {
>>                          pause("fwlps", (50 * hz + 999) / 1000);
>>                          device_printf(dev, "lps not set, 
>> attempt(%d)\n", lps_cou
>> nter);
>>                  } /* else
>>                          device_printf(dev, "lps(%0x) set\n", lps);*/
>>          }
>>
>> In my case the lps is not NULL, so we print something in the first run 
>> of the loop, this print statement is enough 'time' for the card to come 
>> up. If we leave the printf away, it is not enough time to come up for 
>> the card. Panic.
>>
>> This was the same thing I reported, adding a printf statement at the 
>> beginning of fwphy_rddata cures my panic.
>>
>> So I'd suggest to leave the lps test away and add always a pause(9), or 
>> does this cause headache on other archs?
>>
>> Thanks,
>> Andreas
>>
> 
> 
> Ok, I think I've finally caught up to Marius (at least in this
> situation).  
> 
> The *ACTUAL* issue is that fwochi_probe_phy() code isn't properly
> handling the transition state from LPS==0 to LPS==1.  In this period of
> time, the internal SCLK on the firewire board may have not started yet.
> There can be a period of time between the value of LPS==1 and the SCLK
> actually starting.  
> 
> fwphy_rddata() appears to be *trying* to deal with this, but is
> obviously failing.  
> 
> So "lps" has been set, but the PHY is not up yet.  In order to access
> PHY resources, we have to wait for SCLK to start(OHCI spec v1.1 table
> 6.1).
> 
> I believe your error is defined in the OHCI spec, Appendix A.6, PCI Bus
> Errors.  The bus error is supposed to happen!  :)  The driver just isn't
> handling the error case properly.
> 
> The proper fix is to handle the ERROR according to spec.  I will work on
> a proper solution this weekend.  In the meantime, here is a patch to get
> you by based on the pause() mechanism.
> 
> Sorry for the slow progress here, I appreciate your testing Andreas!

Sean, no need to excuse, I'm busy with a lot of things. My day job, 
well, my day and night job, only permits some hours in the night to play 
around with this cool OS.

For me it is a pleasure to help out testing here. It is a possibility 
for me to learn more about fbsd and its development process.

If I can help more, feed me with code to test. I hope I'll get the 
experience to push out some patches of my own in the future :)

Regards,
Andreas


More information about the freebsd-firewire mailing list