]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blobdiff - drivers/bluetooth/btmrvl_sdio.c
Merge tag 'scsi-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi
[mirror_ubuntu-artful-kernel.git] / drivers / bluetooth / btmrvl_sdio.c
index f425ddf91a2459c7af330584da6ab9b5018a84a6..d02f2c14df32545782f4d7759bb4409e482cc063 100644 (file)
@@ -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);
@@ -1625,6 +1625,7 @@ static int btmrvl_sdio_suspend(struct device *dev)
        if (priv->adapter->hs_state != HS_ACTIVATED) {
                if (btmrvl_enable_hs(priv)) {
                        BT_ERR("HS not actived, suspend failed!");
+                       priv->adapter->is_suspending = false;
                        return -EBUSY;
                }
        }