|
@@ -1071,7 +1071,6 @@ static int btmrvl_sdio_host_to_card(struct btmrvl_private *priv,
|
|
|
{
|
|
|
struct btmrvl_sdio_card *card = priv->btmrvl_dev.card;
|
|
|
int ret = 0;
|
|
|
- int buf_block_len;
|
|
|
int blksz;
|
|
|
int i = 0;
|
|
|
u8 *buf = NULL;
|
|
@@ -1083,9 +1082,13 @@ static int btmrvl_sdio_host_to_card(struct btmrvl_private *priv,
|
|
|
return -EINVAL;
|
|
|
}
|
|
|
|
|
|
+ blksz = DIV_ROUND_UP(nb, SDIO_BLOCK_SIZE) * SDIO_BLOCK_SIZE;
|
|
|
+
|
|
|
buf = payload;
|
|
|
- if ((unsigned long) payload & (BTSDIO_DMA_ALIGN - 1)) {
|
|
|
- tmpbufsz = ALIGN_SZ(nb, BTSDIO_DMA_ALIGN);
|
|
|
+ if ((unsigned long) payload & (BTSDIO_DMA_ALIGN - 1) ||
|
|
|
+ nb < blksz) {
|
|
|
+ tmpbufsz = ALIGN_SZ(blksz, BTSDIO_DMA_ALIGN) +
|
|
|
+ BTSDIO_DMA_ALIGN;
|
|
|
tmpbuf = kzalloc(tmpbufsz, GFP_KERNEL);
|
|
|
if (!tmpbuf)
|
|
|
return -ENOMEM;
|
|
@@ -1093,15 +1096,12 @@ static int btmrvl_sdio_host_to_card(struct btmrvl_private *priv,
|
|
|
memcpy(buf, payload, nb);
|
|
|
}
|
|
|
|
|
|
- blksz = SDIO_BLOCK_SIZE;
|
|
|
- buf_block_len = DIV_ROUND_UP(nb, blksz);
|
|
|
-
|
|
|
sdio_claim_host(card->func);
|
|
|
|
|
|
do {
|
|
|
/* Transfer data to card */
|
|
|
ret = sdio_writesb(card->func, card->ioport, buf,
|
|
|
- buf_block_len * blksz);
|
|
|
+ blksz);
|
|
|
if (ret < 0) {
|
|
|
i++;
|
|
|
BT_ERR("i=%d writesb failed: %d", i, ret);
|