Messages in this thread Patch in this message | | | Date | Mon, 11 May 2009 16:41:51 +0200 | From | Luis Galdos <> | Subject | [LIBERTAS-SDIO] Support for single transfer blocks? |
| |
Hi all,
I have one question concerning to the Libertas-driver: Does this driver works with SDIO-hosts that only support single transfer blocks? I ask cause I have seen two problems with a SDIO-port that doesn't support multiple blocks:
* The firmware installation successes only with a modification of the block size (see below patch)
* The transfer of Ethernet-frames works only if the "complete" frame is smaller than the block size of the SDIO-host. By larger packages, the SD8686 doesn't generate the expected IRQ (cause it expected a multiple transfer) and the driver detects a timeout.
Do you know something about this? Thanks in advance,
PS: Sorry for the possible wrong format of this email (my first one)
diff --git a/drivers/net/wireless/libertas/if_sdio.c b/drivers/net/wireless/libertas/if_sdio.c index b54e2ea..f88a4da 100644 --- a/drivers/net/wireless/libertas/if_sdio.c +++ b/drivers/net/wireless/libertas/if_sdio.c @@ -33,6 +33,7 @@ #include <linux/mmc/card.h> #include <linux/mmc/sdio_func.h> #include <linux/mmc/sdio_ids.h> +#include <linux/mmc/host.h>
#include "host.h" #include "decl.h" @@ -507,6 +508,8 @@ static int if_sdio_prog_real(struct if_sdio_card *card) u32 chunk_size; const u8 *firmware; size_t size, req_size; + struct mmc_host *host; + int max_blksize = 0;
lbs_deb_enter(LBS_DEB_SDIO);
@@ -524,7 +527,19 @@ static int if_sdio_prog_real(struct if_sdio_card *card)
sdio_claim_host(card->func);
- ret = sdio_set_block_size(card->func, 32); + /* + * If the host doesn't support multi-blocks, then use the the maximal block + * size for the transfers. Otherwise the firmware installation will fail. + */ + host = card->func->card->host; + if (host->max_blk_count == 1) { + lbs_pr_info("Setting block size to %u\n", host->max_blk_size); + max_blksize = card->func->max_blksize; + card->func->max_blksize = host->max_blk_size; + ret = sdio_set_block_size(card->func, host->max_blk_size); + } else + ret = sdio_set_block_size(card->func, 32); + if (ret) goto release;
@@ -593,6 +608,10 @@ static int if_sdio_prog_real(struct if_sdio_card *card)
ret = 0;
+ /* Restore the original block size if it was changed before */ + if (max_blksize) + card->func->max_blksize = max_blksize; + lbs_deb_sdio("waiting for firmware to boot...\n");
/* wait for the firmware to boot */
-- Luis Galdos
| |