mg_disk: Add missing ready status check on mg_write()

When last sector is written, ready bit of status register should be
checked.

Signed-off-by: unsik Kim <donari75@gmail.com>
Acked-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Signed-off-by: Jens Axboe <jens.axboe@oracle.com>

authored by unsik Kim and committed by Jens Axboe a85a00a6 394c6cc6

+16 -18
+16 -18
drivers/block/mg_disk.c
··· 524 static void mg_write(struct request *req) 525 { 526 struct mg_host *host = req->rq_disk->private_data; 527 - bool rem; 528 529 - if (mg_out(host, blk_rq_pos(req), blk_rq_sectors(req), 530 MG_CMD_WR, NULL) != MG_ERR_NONE) { 531 mg_bad_rw_intr(host); 532 return; 533 } 534 535 MG_DBG("requested %d sects (from %ld), buffer=0x%p\n", 536 - blk_rq_sectors(req), blk_rq_pos(req), req->buffer); 537 538 if (mg_wait(host, ATA_DRQ, 539 MG_TMAX_WAIT_WR_DRQ) != MG_ERR_NONE) { ··· 541 return; 542 } 543 544 - mg_write_one(host, req); 545 - 546 - outb(MG_CMD_WR_CONF, (unsigned long)host->dev_base + MG_REG_COMMAND); 547 - 548 do { 549 - if (blk_rq_sectors(req) > 1 && 550 - mg_wait(host, ATA_DRQ, 551 - MG_TMAX_WAIT_WR_DRQ) != MG_ERR_NONE) { 552 mg_bad_rw_intr(host); 553 return; 554 } 555 - 556 - rem = mg_end_request(host, 0, MG_SECTOR_SIZE); 557 - if (rem) 558 - mg_write_one(host, req); 559 - 560 - outb(MG_CMD_WR_CONF, 561 - (unsigned long)host->dev_base + MG_REG_COMMAND); 562 - } while (rem); 563 } 564 565 static void mg_read_intr(struct mg_host *host)
··· 524 static void mg_write(struct request *req) 525 { 526 struct mg_host *host = req->rq_disk->private_data; 527 + unsigned int rem = blk_rq_sectors(req); 528 529 + if (mg_out(host, blk_rq_pos(req), rem, 530 MG_CMD_WR, NULL) != MG_ERR_NONE) { 531 mg_bad_rw_intr(host); 532 return; 533 } 534 535 MG_DBG("requested %d sects (from %ld), buffer=0x%p\n", 536 + rem, blk_rq_pos(req), req->buffer); 537 538 if (mg_wait(host, ATA_DRQ, 539 MG_TMAX_WAIT_WR_DRQ) != MG_ERR_NONE) { ··· 541 return; 542 } 543 544 do { 545 + mg_write_one(host, req); 546 + 547 + outb(MG_CMD_WR_CONF, (unsigned long)host->dev_base + 548 + MG_REG_COMMAND); 549 + 550 + rem--; 551 + if (rem > 1 && mg_wait(host, ATA_DRQ, 552 + MG_TMAX_WAIT_WR_DRQ) != MG_ERR_NONE) { 553 + mg_bad_rw_intr(host); 554 + return; 555 + } else if (mg_wait(host, MG_STAT_READY, 556 + MG_TMAX_WAIT_WR_DRQ) != MG_ERR_NONE) { 557 mg_bad_rw_intr(host); 558 return; 559 } 560 + } while (mg_end_request(host, 0, MG_SECTOR_SIZE)); 561 } 562 563 static void mg_read_intr(struct mg_host *host)