mmc,sdio: helper function for transfer padding

There are a lot of crappy controllers out there that cannot handle
all the request sizes that the MMC/SD/SDIO specifications require.
In case the card driver can pad the data to overcome the problems,
this commit adds a helper that calculates how much that padding
should be.

A corresponding helper is also added for SDIO, but it can also deal
with all the complexities of splitting up a large transfer efficiently.

Signed-off-by: Pierre Ossman <drzeus@drzeus.cx>
This commit is contained in:
Pierre Ossman
2008-06-28 12:52:45 +02:00
parent e2d2647702
commit ad3868b2ec
5 changed files with 137 additions and 16 deletions

View File

@@ -1,7 +1,7 @@
/*
* linux/drivers/net/wireless/libertas/if_sdio.c
*
* Copyright 2007 Pierre Ossman
* Copyright 2007-2008 Pierre Ossman
*
* Inspired by if_cs.c, Copyright 2007 Holger Schurig
*
@@ -266,13 +266,10 @@ static int if_sdio_card_to_host(struct if_sdio_card *card)
/*
* The transfer must be in one transaction or the firmware
* goes suicidal.
* goes suicidal. There's no way to guarantee that for all
* controllers, but we can at least try.
*/
chunk = size;
if ((chunk > card->func->cur_blksize) || (chunk > 512)) {
chunk = (chunk + card->func->cur_blksize - 1) /
card->func->cur_blksize * card->func->cur_blksize;
}
chunk = sdio_align_size(card->func, size);
ret = sdio_readsb(card->func, card->buffer, card->ioport, chunk);
if (ret)
@@ -696,13 +693,10 @@ static int if_sdio_host_to_card(struct lbs_private *priv,
/*
* The transfer must be in one transaction or the firmware
* goes suicidal.
* goes suicidal. There's no way to guarantee that for all
* controllers, but we can at least try.
*/
size = nb + 4;
if ((size > card->func->cur_blksize) || (size > 512)) {
size = (size + card->func->cur_blksize - 1) /
card->func->cur_blksize * card->func->cur_blksize;
}
size = sdio_align_size(card->func, nb + 4);
packet = kzalloc(sizeof(struct if_sdio_packet) + size,
GFP_ATOMIC);