Commit a85a00a699740f6f9863f88aef22060fe1534681

Authored by unsik Kim
Committed by Jens Axboe
1 parent 394c6cc63c

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>

Showing 1 changed file with 15 additions and 17 deletions Side-by-side Diff

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