Index: drivers/net/wireless/Kconfig =================================================================== RCS file: /usr/local/cvs/linux/os/linux-2.6/drivers/net/wireless/Kconfig,v retrieving revision 1.1.1.24 diff -u -r1.1.1.24 Kconfig --- drivers/net/wireless/Kconfig 2 Jun 2008 15:08:36 -0000 1.1.1.24 +++ drivers/net/wireless/Kconfig 27 Jun 2008 13:09:11 -0000 @@ -289,6 +289,17 @@ ---help--- A driver for Marvell Libertas 8385 and 8686 SDIO devices. +config LIBERTAS_SDIO_PAD_SIZE + int "Marvell Libertas SDIO packet pad size" + depends on LIBERTAS && MMC && LIBERTAS_SDIO + ---help--- + If you have a buggy SDIO controller that need a certain size + alignment set it here, typical values are: + 0 if you have a nice SDIO controller, + 1 if 16 bit aligned sizes is enough, + 3 to get 32 bit aligned sizes (should work for most hardware) + The code does: size = (size + PAD_SIZE) & ~PAD_SIZE; + config LIBERTAS_DEBUG bool "Enable full debugging output in the Libertas module." depends on LIBERTAS Index: drivers/net/wireless/libertas/if_sdio.c =================================================================== RCS file: /usr/local/cvs/linux/os/linux-2.6/drivers/net/wireless/libertas/if_sdio.c,v retrieving revision 1.1.1.2 diff -u -r1.1.1.2 if_sdio.c --- drivers/net/wireless/libertas/if_sdio.c 2 Jun 2008 15:08:37 -0000 1.1.1.2 +++ drivers/net/wireless/libertas/if_sdio.c 27 Jun 2008 13:09:11 -0000 @@ -53,6 +53,14 @@ MODULE_DEVICE_TABLE(sdio, if_sdio_ids); +#define SDIO_PAD_SIZE CONFIG_LIBERTAS_SDIO_PAD_SIZE +#if SDIO_PAD_SIZE +#define SDIO_PADDED_SIZE(len) ( ((len)+SDIO_PAD_SIZE) & ~SDIO_PAD_SIZE ) +#else +#define SDIO_PADDED_SIZE(len) (len) +#endif + + struct if_sdio_model { int model; const char *helper; @@ -280,6 +288,7 @@ * The transfer must be in one transaction or the firmware * goes suicidal. */ + size = SDIO_PADDED_SIZE(size); chunk = size; if ((chunk > card->func->cur_blksize) || (chunk > 512)) { chunk = (chunk + card->func->cur_blksize - 1) / @@ -711,6 +720,7 @@ * goes suicidal. */ size = nb + 4; + size = SDIO_PADDED_SIZE(size); if ((size > card->func->cur_blksize) || (size > 512)) { size = (size + card->func->cur_blksize - 1) / card->func->cur_blksize * card->func->cur_blksize;