tifm_sd: DATA_CARRY is not boolean in tifm_sd_transfer_data()
[sfrench/cifs-2.6.git] / drivers / mmc / host / tifm_sd.c
index 951392d2ce37140cabbac77b1d6cc146b56c3995..1c14a186f000acc10b23b59b5bc554533bf6a4ec 100644 (file)
@@ -180,7 +180,7 @@ static void tifm_sd_transfer_data(struct tifm_sd *host)
                        host->sg_pos++;
                        if (host->sg_pos == host->sg_len) {
                                if ((r_data->flags & MMC_DATA_WRITE)
-                                   && DATA_CARRY)
+                                   && (host->cmd_flags & DATA_CARRY))
                                        writel(host->bounce_buf_data[0],
                                               host->dev->addr
                                               + SOCK_MMCSD_DATA);
@@ -191,7 +191,7 @@ static void tifm_sd_transfer_data(struct tifm_sd *host)
                }
                off = sg[host->sg_pos].offset + host->block_pos;
 
-               pg = nth_page(sg[host->sg_pos].page, off >> PAGE_SHIFT);
+               pg = nth_page(sg_page(&sg[host->sg_pos]), off >> PAGE_SHIFT);
                p_off = offset_in_page(off);
                p_cnt = PAGE_SIZE - p_off;
                p_cnt = min(p_cnt, cnt);
@@ -240,18 +240,18 @@ static void tifm_sd_bounce_block(struct tifm_sd *host, struct mmc_data *r_data)
                }
                off = sg[host->sg_pos].offset + host->block_pos;
 
-               pg = nth_page(sg[host->sg_pos].page, off >> PAGE_SHIFT);
+               pg = nth_page(sg_page(&sg[host->sg_pos]), off >> PAGE_SHIFT);
                p_off = offset_in_page(off);
                p_cnt = PAGE_SIZE - p_off;
                p_cnt = min(p_cnt, cnt);
                p_cnt = min(p_cnt, t_size);
 
                if (r_data->flags & MMC_DATA_WRITE)
-                       tifm_sd_copy_page(host->bounce_buf.page,
+                       tifm_sd_copy_page(sg_page(&host->bounce_buf),
                                          r_data->blksz - t_size,
                                          pg, p_off, p_cnt);
                else if (r_data->flags & MMC_DATA_READ)
-                       tifm_sd_copy_page(pg, p_off, host->bounce_buf.page,
+                       tifm_sd_copy_page(pg, p_off, sg_page(&host->bounce_buf),
                                          r_data->blksz - t_size, p_cnt);
 
                t_size -= p_cnt;
@@ -637,17 +637,15 @@ static void tifm_sd_request(struct mmc_host *mmc, struct mmc_request *mrq)
                goto err_out;
        }
 
-       if (mrq->data && (hweight32(mrq->data->blksz) > 1)) {
-               printk(KERN_ERR "%s: Unsupported block size (%d bytes)\n",
-                       sock->dev.bus_id, mrq->data->blksz);
-               mrq->cmd->error = -EINVAL;
-               goto err_out;
-       }
-
        host->cmd_flags = 0;
        host->block_pos = 0;
        host->sg_pos = 0;
 
+       if (mrq->data && !is_power_of_2(mrq->data->blksz))
+               host->no_dma = 1;
+       else
+               host->no_dma = no_dma ? 1 : 0;
+
        if (r_data) {
                tifm_sd_set_data_timeout(host, r_data);
 
@@ -675,7 +673,7 @@ static void tifm_sd_request(struct mmc_host *mmc, struct mmc_request *mrq)
                                            : PCI_DMA_FROMDEVICE)) {
                                printk(KERN_ERR "%s : scatterlist map failed\n",
                                       sock->dev.bus_id);
-                               spin_unlock_irqrestore(&sock->lock, flags);
+                               mrq->cmd->error = -ENOMEM;
                                goto err_out;
                        }
                        host->sg_len = tifm_map_sg(sock, r_data->sg,
@@ -691,7 +689,7 @@ static void tifm_sd_request(struct mmc_host *mmc, struct mmc_request *mrq)
                                              r_data->flags & MMC_DATA_WRITE
                                              ? PCI_DMA_TODEVICE
                                              : PCI_DMA_FROMDEVICE);
-                               spin_unlock_irqrestore(&sock->lock, flags);
+                               mrq->cmd->error = -ENOMEM;
                                goto err_out;
                        }
 
@@ -965,7 +963,6 @@ static int tifm_sd_probe(struct tifm_dev *sock)
                return -ENOMEM;
 
        host = mmc_priv(mmc);
-       host->no_dma = no_dma;
        tifm_set_drvdata(sock, mmc);
        host->dev = sock;
        host->timeout_jiffies = msecs_to_jiffies(1000);