mmc/dw_mmc: Allocate the correct amount of descriptors
PATCH 1/2 mmc/dw_mmc: Allocate the correct amount of descriptors
This fixes two issues:
* a descriptor was allocated for every block, while a descriptor can take 8 blocks
* there was an off-by-one error in the descriptor preparation: there were two last descriptors, one with length==0
Signed-off-by Mischa Jonker <[email protected]>
Cc Alexey Brodkin <[email protected]>
Cc Jaehoon Chung <[email protected]>
Cc Andy Fleming <[email protected]>
--- drivers/mmc/dw_mmc.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/mmc/dw_mmc.c +2 -2
@@ -72,7 +72,7 @@ static void dwmci_prepare_data(struct dwmci_host *host,dwmci_set_idma_desc (cur_idmac, flags, cnt, start_addr + (i *PAGE_SIZE )); -if (blk_cnt <8 ) +if (blk_cnt <=8 )break ; blk_cnt -=8 ; cur_idmac++;
@@ -111,7 +111,7 @@ static int dwmci_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd, {struct dwmci_host *host = (struct dwmci_host *)mmc->priv; ALLOC_CACHE_ALIGN_BUFFER(struct dwmci_idmac, cur_idmac, - data ? data->blocks : 0); + data ? DIV_ROUND_UP(data->blocks, 8) : 0);int flags =0 , i;unsigned int timeout =100000 ;u32 retry =10000 ;
Signature · 1 line
1.7.9.5
PATCH 2/2 Add parentheses to ALLOC_ALIGN_BUFFER macro's
Without those it's very easy to make mistakes when for instance the 'size' field is more than just a constant.
Signed-off-by Mischa Jonker <[email protected]>
Cc Alexey Brodkin <[email protected]>
Cc Marek Vasut <[email protected]>
Cc Anton Staaf <[email protected]>
Cc Tom Rini <[email protected]>
Cc Wolfgang Denk <[email protected]>
--- include/common.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
include/common.h +2 -2
@@ -1015,10 +1015,10 @@ static inline phys_addr_t map_to_sysmem(void *ptr)* of a function scoped static buffer. It can not be used to create a cache * line aligned global buffer. */ -#define PAD_COUNT (s, pad) ((s - 1) / pad + 1) +#define PAD_COUNT (s, pad) (((s) - 1) / (pad) + 1)#define PAD_SIZE (s, pad) (PAD_COUNT(s, pad) * pad)#define ALLOC_ALIGN_BUFFER_PAD (type, name, size, align, pad) \ - char __##name[ROUND(PAD_SIZE(size * sizeof(type), pad), align) \ + char __##name[ROUND(PAD_SIZE((size) * sizeof(type), pad), align) \ + (align - 1)]; \ \ type *name = (type *) ALIGN((uintptr_t)__##name, align)
Signature · 1 line
1.7.9.5