Messages in this thread | | | From | Bartlomiej Zolnierkiewicz <> | Subject | Re: [PATCH] mg_disk: Add missing ready status check on mg_write() | Date | Fri, 24 Jul 2009 12:41:42 +0200 |
| |
On Thursday 23 July 2009 06:21:18 unsik Kim wrote: > 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>
[ It is on top of my patch (http://lkml.org/lkml/2009/6/28/237), right?
I assume that both patches were verified with hardware and are ready to be merged upstream now? ]
> --- > drivers/block/mg_disk.c | 32 +++++++++++++++----------------- > 1 files changed, 15 insertions(+), 17 deletions(-) > > diff --git a/drivers/block/mg_disk.c b/drivers/block/mg_disk.c > index f8149db..64f90f5 100644 > --- a/drivers/block/mg_disk.c > +++ b/drivers/block/mg_disk.c > @@ -516,16 +516,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) { > @@ -533,25 +533,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)
| |