Increase the wait time for acquiring the bus from 10 to 250ms.
Normally it never needs to wait here at all; waiting is done at the end of the prior command. When doing a crash dump, the normal interrupt mechanism isn't used; instead the interrupt handler is called repeatedly in a polling-like manner. This can subvert hardware-specific drivers and lead to trying to start a new command while the previous command is still busy on the bus. Since the SD spec says the longest a card can take to execute any command is 250ms, use that as a timeout.
This commit is contained in:
parent
f1887a86aa
commit
8775ab4589
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=261940
@ -767,8 +767,17 @@ sdhci_start_command(struct sdhci_slot *slot, struct mmc_command *cmd)
|
||||
/* We shouldn't wait for DAT for stop commands. */
|
||||
if (cmd == slot->req->stop)
|
||||
mask &= ~SDHCI_DAT_INHIBIT;
|
||||
/* Wait for bus no more then 10 ms. */
|
||||
timeout = 10;
|
||||
/*
|
||||
* Wait for bus no more then 250 ms. Typically there will be no wait
|
||||
* here at all, but when writing a crash dump we may be bypassing the
|
||||
* host platform's interrupt handler, and in some cases that handler
|
||||
* may be working around hardware quirks such as not respecting r1b
|
||||
* busy indications. In those cases, this wait-loop serves the purpose
|
||||
* of waiting for the prior command and data transfers to be done, and
|
||||
* SD cards are allowed to take up to 250ms for write and erase ops.
|
||||
* (It's usually more like 20-30ms in the real world.)
|
||||
*/
|
||||
timeout = 250;
|
||||
while (state & mask) {
|
||||
if (timeout == 0) {
|
||||
slot_printf(slot, "Controller never released "
|
||||
|
Loading…
Reference in New Issue
Block a user