Le 26/11/2010 12:17, Nicolas Ferre : > Le 25/11/2010 11:11, Yauhen Kharuzhy : >> The AT91 MCI has special SDIO transfer types: SDIO block and SDIO byte >> transfers, but at91_mci driver doesn't use them and handles all SDIO >> transfers as ordinary MMC block transfers. This causes problems for >> multiple-block SDIO transfers (in particular for 256-bytes blocks). >> >> Fix this situation by check opcode for SDIO CMD53 and set transfer >> type in AT91_MCI_CMDR register properly. >> >> This patch was tested with libertas SDIO driver: problem with TX >> timeouts on big packets was eliminated. >> >> Signed-off-by: Yauhen Kharuzhy <yauhen.kharuzhy@xxxxxxxxxxx> > > Signed-off-by: Nicolas Ferre <nicolas.ferre@xxxxxxxxx> Hi Chris, A little "ping"! Do you want that I re-send you the patch with relevant S-O-B lines or you can include them yourself? Best regards, >> --- >> arch/arm/mach-at91/include/mach/at91_mci.h | 2 ++ >> drivers/mmc/host/at91_mci.c | 13 +++++++++---- >> 2 files changed, 11 insertions(+), 4 deletions(-) >> >> diff --git a/arch/arm/mach-at91/include/mach/at91_mci.h b/arch/arm/mach-at91/include/mach/at91_mci.h >> index 57f8ee1..27ac6f5 100644 >> --- a/arch/arm/mach-at91/include/mach/at91_mci.h >> +++ b/arch/arm/mach-at91/include/mach/at91_mci.h >> @@ -74,6 +74,8 @@ >> #define AT91_MCI_TRTYP_BLOCK (0 << 19) >> #define AT91_MCI_TRTYP_MULTIPLE (1 << 19) >> #define AT91_MCI_TRTYP_STREAM (2 << 19) >> +#define AT91_MCI_TRTYP_SDIO_BYTE (4 << 19) >> +#define AT91_MCI_TRTYP_SDIO_BLOCK (5 << 19) >> >> #define AT91_MCI_BLKR 0x18 /* Block Register */ >> #define AT91_MCI_BLKR_BCNT(n) ((0xffff & (n)) << 0) /* Block count */ >> diff --git a/drivers/mmc/host/at91_mci.c b/drivers/mmc/host/at91_mci.c >> index 591ab54..d3e6a96 100644 >> --- a/drivers/mmc/host/at91_mci.c >> +++ b/drivers/mmc/host/at91_mci.c >> @@ -69,6 +69,7 @@ >> #include <linux/highmem.h> >> >> #include <linux/mmc/host.h> >> +#include <linux/mmc/sdio.h> >> >> #include <asm/io.h> >> #include <asm/irq.h> >> @@ -493,10 +494,14 @@ static void at91_mci_send_command(struct at91mci_host *host, struct mmc_command >> else if (data->flags & MMC_DATA_WRITE) >> cmdr |= AT91_MCI_TRCMD_START; >> >> - if (data->flags & MMC_DATA_STREAM) >> - cmdr |= AT91_MCI_TRTYP_STREAM; >> - if (data->blocks > 1) >> - cmdr |= AT91_MCI_TRTYP_MULTIPLE; >> + if (cmd->opcode == SD_IO_RW_EXTENDED) { >> + cmdr |= AT91_MCI_TRTYP_SDIO_BLOCK; >> + } else { >> + if (data->flags & MMC_DATA_STREAM) >> + cmdr |= AT91_MCI_TRTYP_STREAM; >> + if (data->blocks > 1) >> + cmdr |= AT91_MCI_TRTYP_MULTIPLE; >> + } >> } >> else { >> block_length = 0; > > -- Nicolas Ferre -- To unsubscribe from this list: send the line "unsubscribe linux-mmc" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html