mirror of https://gitee.com/openkylin/qemu.git
hw/sd/sdhci: Stop multiple transfers when block count is cleared
Clearing BlockCount stops multiple transfers. See "SD Host Controller Simplified Specification Version 2.00": - 2.2.3. Block Count Register (Offset 006h) - Table 2-8 : Determination of Transfer Type Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org> Tested-by: Alexander Bulekov <alxndr@bu.edu> Message-Id: <20200903172806.489710-2-f4bug@amsat.org>
This commit is contained in:
parent
dfba99f17f
commit
6a9e5cc61c
|
@ -731,6 +731,12 @@ static void sdhci_do_adma(SDHCIState *s)
|
|||
ADMADescr dscr = {};
|
||||
int i;
|
||||
|
||||
if (s->trnmod & SDHC_TRNS_BLK_CNT_EN && !s->blkcnt) {
|
||||
/* Stop Multiple Transfer */
|
||||
sdhci_end_transfer(s);
|
||||
return;
|
||||
}
|
||||
|
||||
for (i = 0; i < SDHC_ADMA_DESCS_PER_DELAY; ++i) {
|
||||
s->admaerr &= ~SDHC_ADMAERR_LENGTH_MISMATCH;
|
||||
|
||||
|
@ -756,7 +762,6 @@ static void sdhci_do_adma(SDHCIState *s)
|
|||
|
||||
switch (dscr.attr & SDHC_ADMA_ATTR_ACT_MASK) {
|
||||
case SDHC_ADMA_ATTR_ACT_TRAN: /* data transfer */
|
||||
|
||||
if (s->trnmod & SDHC_TRNS_READ) {
|
||||
while (length) {
|
||||
if (s->data_count == 0) {
|
||||
|
|
Loading…
Reference in New Issue