sky2: Factor out code to calculate packet sizes
[safe/jmp/linux-2.6] / drivers / block / mg_disk.c
index 19917d5..02b2583 100644 (file)
@@ -524,16 +524,16 @@ static void mg_write_one(struct mg_host *host, struct request *req)
 static void mg_write(struct request *req)
 {
        struct mg_host *host = req->rq_disk->private_data;
-       bool rem;
+       unsigned int rem = blk_rq_sectors(req);
 
-       if (mg_out(host, blk_rq_pos(req), blk_rq_sectors(req),
+       if (mg_out(host, blk_rq_pos(req), rem,
                   MG_CMD_WR, NULL) != MG_ERR_NONE) {
                mg_bad_rw_intr(host);
                return;
        }
 
        MG_DBG("requested %d sects (from %ld), buffer=0x%p\n",
-              blk_rq_sectors(req), blk_rq_pos(req), req->buffer);
+              rem, blk_rq_pos(req), req->buffer);
 
        if (mg_wait(host, ATA_DRQ,
                    MG_TMAX_WAIT_WR_DRQ) != MG_ERR_NONE) {
@@ -541,25 +541,23 @@ static void mg_write(struct request *req)
                return;
        }
 
-       mg_write_one(host, req);
+       do {
+               mg_write_one(host, req);
 
-       outb(MG_CMD_WR_CONF, (unsigned long)host->dev_base + MG_REG_COMMAND);
+               outb(MG_CMD_WR_CONF, (unsigned long)host->dev_base +
+                               MG_REG_COMMAND);
 
-       do {
-               if (blk_rq_sectors(req) > 1 &&
-                    mg_wait(host, ATA_DRQ,
-                            MG_TMAX_WAIT_WR_DRQ) != MG_ERR_NONE) {
+               rem--;
+               if (rem > 1 && mg_wait(host, ATA_DRQ,
+                                       MG_TMAX_WAIT_WR_DRQ) != MG_ERR_NONE) {
+                       mg_bad_rw_intr(host);
+                       return;
+               } else if (mg_wait(host, MG_STAT_READY,
+                                       MG_TMAX_WAIT_WR_DRQ) != MG_ERR_NONE) {
                        mg_bad_rw_intr(host);
                        return;
                }
-
-               rem = mg_end_request(host, 0, MG_SECTOR_SIZE);
-               if (rem)
-                       mg_write_one(host, req);
-
-               outb(MG_CMD_WR_CONF,
-                    (unsigned long)host->dev_base + MG_REG_COMMAND);
-       } while (rem);
+       } while (mg_end_request(host, 0, MG_SECTOR_SIZE));
 }
 
 static void mg_read_intr(struct mg_host *host)
@@ -777,7 +775,7 @@ static int mg_getgeo(struct block_device *bdev, struct hd_geometry *geo)
        return 0;
 }
 
-static struct block_device_operations mg_disk_ops = {
+static const struct block_device_operations mg_disk_ops = {
        .getgeo = mg_getgeo
 };
 
@@ -862,7 +860,7 @@ static int mg_probe(struct platform_device *plat_dev)
                err = -EINVAL;
                goto probe_err_2;
        }
-       host->dev_base = ioremap(rsc->start , rsc->end + 1);
+       host->dev_base = ioremap(rsc->start, resource_size(rsc));
        if (!host->dev_base) {
                printk(KERN_ERR "%s:%d ioremap fail\n",
                                __func__, __LINE__);