From 23f53da43923fe75840b6c54e746bcd3ff4c8773 Mon Sep 17 00:00:00 2001 From: lhh Date: Sun, 23 Jan 2011 18:23:43 +0800 Subject: [PATCH] updata rk29 mmcdrivers/mmc/host/rk29_sdmmc.c --- drivers/mmc/host/rk29_sdmmc.c | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/drivers/mmc/host/rk29_sdmmc.c b/drivers/mmc/host/rk29_sdmmc.c index 570c5b02bb06..812ee390866c 100755 --- a/drivers/mmc/host/rk29_sdmmc.c +++ b/drivers/mmc/host/rk29_sdmmc.c @@ -962,10 +962,8 @@ static void rk29_sdmmc_read_data_pio(struct rk29_sdmmc *host) old_len = len; if (likely(offset + len <= sg->length)) { rk29_sdmmc_pull_data(host, (void *)(buf + offset),len); - offset += len; nbytes += len; - if (offset == sg->length) { flush_dcache_page(sg_page(sg)); host->sg = sg = sg_next(sg); @@ -993,7 +991,8 @@ static void rk29_sdmmc_read_data_pio(struct rk29_sdmmc *host) rk29_sdmmc_write(host->regs, SDMMC_RINTSTS,SDMMC_INT_RXDR); // clear RXDR interrupt if (status & RK29_SDMMC_DATA_ERROR_FLAGS) { host->data_status = status; - data->bytes_xfered += nbytes; + if(data) + data->bytes_xfered += nbytes; smp_wmb(); rk29_sdmmc_set_pending(host, EVENT_DATA_ERROR); tasklet_schedule(&host->tasklet); @@ -1003,11 +1002,13 @@ static void rk29_sdmmc_read_data_pio(struct rk29_sdmmc *host) } while (status & SDMMC_INT_RXDR); // if the RXDR is ready let read again len = SDMMC_GET_FCNT(rk29_sdmmc_read(host->regs, SDMMC_STATUS)); host->pio_offset = offset; - data->bytes_xfered += nbytes; + if(data) + data->bytes_xfered += nbytes; return; done: - data->bytes_xfered += nbytes; + if(data) + data->bytes_xfered += nbytes; smp_wmb(); rk29_sdmmc_set_pending(host, EVENT_XFER_COMPLETE); } @@ -1057,7 +1058,8 @@ static void rk29_sdmmc_write_data_pio(struct rk29_sdmmc *host) rk29_sdmmc_write(host->regs, SDMMC_RINTSTS,SDMMC_INT_TXDR); // clear RXDR interrupt if (status & RK29_SDMMC_DATA_ERROR_FLAGS) { host->data_status = status; - data->bytes_xfered += nbytes; + if(data) + data->bytes_xfered += nbytes; smp_wmb(); rk29_sdmmc_set_pending(host, EVENT_DATA_ERROR); tasklet_schedule(&host->tasklet); @@ -1066,12 +1068,13 @@ static void rk29_sdmmc_write_data_pio(struct rk29_sdmmc *host) } while (status & SDMMC_INT_TXDR); // if TXDR, let write again host->pio_offset = offset; - data->bytes_xfered += nbytes; - + if(data) + data->bytes_xfered += nbytes; return; done: - data->bytes_xfered += nbytes; + if(data) + data->bytes_xfered += nbytes; smp_wmb(); rk29_sdmmc_set_pending(host, EVENT_XFER_COMPLETE); } -- 2.34.1