diff options
author | Pierre Ossman <drzeus@drzeus.cx> | 2008-06-28 06:52:45 -0400 |
---|---|---|
committer | Pierre Ossman <drzeus@drzeus.cx> | 2008-07-15 08:14:44 -0400 |
commit | ad3868b2ec96ec14a1549c9e33f5f9a2a3c6ab15 (patch) | |
tree | 05ca55c5ab38b814bf8d71c0720e5dfaf1419e32 /drivers/net/wireless/libertas | |
parent | e2d2647702702ea08cb78cdc9eca8c24242aa9be (diff) |
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>
Diffstat (limited to 'drivers/net/wireless/libertas')
-rw-r--r-- | drivers/net/wireless/libertas/if_sdio.c | 20 |
1 files changed, 7 insertions, 13 deletions
diff --git a/drivers/net/wireless/libertas/if_sdio.c b/drivers/net/wireless/libertas/if_sdio.c index 3dd537be87d8..b54e2ea8346b 100644 --- a/drivers/net/wireless/libertas/if_sdio.c +++ b/drivers/net/wireless/libertas/if_sdio.c | |||
@@ -1,7 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * linux/drivers/net/wireless/libertas/if_sdio.c | 2 | * linux/drivers/net/wireless/libertas/if_sdio.c |
3 | * | 3 | * |
4 | * Copyright 2007 Pierre Ossman | 4 | * Copyright 2007-2008 Pierre Ossman |
5 | * | 5 | * |
6 | * Inspired by if_cs.c, Copyright 2007 Holger Schurig | 6 | * Inspired by if_cs.c, Copyright 2007 Holger Schurig |
7 | * | 7 | * |
@@ -266,13 +266,10 @@ static int if_sdio_card_to_host(struct if_sdio_card *card) | |||
266 | 266 | ||
267 | /* | 267 | /* |
268 | * The transfer must be in one transaction or the firmware | 268 | * The transfer must be in one transaction or the firmware |
269 | * goes suicidal. | 269 | * goes suicidal. There's no way to guarantee that for all |
270 | * controllers, but we can at least try. | ||
270 | */ | 271 | */ |
271 | chunk = size; | 272 | chunk = sdio_align_size(card->func, size); |
272 | if ((chunk > card->func->cur_blksize) || (chunk > 512)) { | ||
273 | chunk = (chunk + card->func->cur_blksize - 1) / | ||
274 | card->func->cur_blksize * card->func->cur_blksize; | ||
275 | } | ||
276 | 273 | ||
277 | ret = sdio_readsb(card->func, card->buffer, card->ioport, chunk); | 274 | ret = sdio_readsb(card->func, card->buffer, card->ioport, chunk); |
278 | if (ret) | 275 | if (ret) |
@@ -696,13 +693,10 @@ static int if_sdio_host_to_card(struct lbs_private *priv, | |||
696 | 693 | ||
697 | /* | 694 | /* |
698 | * The transfer must be in one transaction or the firmware | 695 | * The transfer must be in one transaction or the firmware |
699 | * goes suicidal. | 696 | * goes suicidal. There's no way to guarantee that for all |
697 | * controllers, but we can at least try. | ||
700 | */ | 698 | */ |
701 | size = nb + 4; | 699 | size = sdio_align_size(card->func, nb + 4); |
702 | if ((size > card->func->cur_blksize) || (size > 512)) { | ||
703 | size = (size + card->func->cur_blksize - 1) / | ||
704 | card->func->cur_blksize * card->func->cur_blksize; | ||
705 | } | ||
706 | 700 | ||
707 | packet = kzalloc(sizeof(struct if_sdio_packet) + size, | 701 | packet = kzalloc(sizeof(struct if_sdio_packet) + size, |
708 | GFP_ATOMIC); | 702 | GFP_ATOMIC); |