Commit a85a00a699740f6f9863f88aef22060fe1534681
Committed by
Jens Axboe
1 parent
394c6cc63c
Exists in
master
and in
39 other branches
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) |