Re: [PATCH 33/33] IDE: sg chaining support
On Wed, Jul 18 2007, Bartlomiej Zolnierkiewicz wrote: > On Monday 16 July 2007, Jens Axboe wrote: > > Cc: [EMAIL PROTECTED] > > Signed-off-by: Jens Axboe <[EMAIL PROTECTED]> > > Acked-by: Bartlomiej Zolnierkiewicz <[EMAIL PROTECTED]> (for both acks) Thanks for reviewing and acking! -- Jens Axboe - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: [PATCH 33/33] IDE: sg chaining support
On Wed, Jul 18 2007, Bartlomiej Zolnierkiewicz wrote: On Monday 16 July 2007, Jens Axboe wrote: Cc: [EMAIL PROTECTED] Signed-off-by: Jens Axboe [EMAIL PROTECTED] Acked-by: Bartlomiej Zolnierkiewicz [EMAIL PROTECTED] (for both acks) Thanks for reviewing and acking! -- Jens Axboe - To unsubscribe from this list: send the line unsubscribe linux-kernel in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: [PATCH 33/33] IDE: sg chaining support
On Monday 16 July 2007, Jens Axboe wrote: > Cc: [EMAIL PROTECTED] > Signed-off-by: Jens Axboe <[EMAIL PROTECTED]> Acked-by: Bartlomiej Zolnierkiewicz <[EMAIL PROTECTED]> - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: [PATCH 33/33] IDE: sg chaining support
On Monday 16 July 2007, Jens Axboe wrote: Cc: [EMAIL PROTECTED] Signed-off-by: Jens Axboe [EMAIL PROTECTED] Acked-by: Bartlomiej Zolnierkiewicz [EMAIL PROTECTED] - To unsubscribe from this list: send the line unsubscribe linux-kernel in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[PATCH 33/33] IDE: sg chaining support
Cc: [EMAIL PROTECTED] Signed-off-by: Jens Axboe <[EMAIL PROTECTED]> --- drivers/ide/cris/ide-cris.c |3 ++- drivers/ide/ide-dma.c |2 +- drivers/ide/ide-io.c |3 ++- drivers/ide/ide-probe.c |2 +- drivers/ide/ide-taskfile.c| 17 + drivers/ide/mips/au1xxx-ide.c |2 +- drivers/ide/pci/sgiioc4.c |2 +- drivers/ide/ppc/pmac.c|2 +- include/linux/ide.h |2 +- 9 files changed, 23 insertions(+), 12 deletions(-) diff --git a/drivers/ide/cris/ide-cris.c b/drivers/ide/cris/ide-cris.c index 886091b..e1b2d01 100644 --- a/drivers/ide/cris/ide-cris.c +++ b/drivers/ide/cris/ide-cris.c @@ -951,7 +951,8 @@ static int cris_ide_build_dmatable (ide_drive_t *drive) /* group sequential buffers into one large buffer */ addr = page_to_phys(sg->page) + sg->offset; size = sg_dma_len(sg); - while (sg++, --i) { + while (--i) { + sg = sg_next(sg); if ((addr + size) != page_to_phys(sg->page) + sg->offset) break; size += sg_dma_len(sg); diff --git a/drivers/ide/ide-dma.c b/drivers/ide/ide-dma.c index 5fe1d72..a9a18a1 100644 --- a/drivers/ide/ide-dma.c +++ b/drivers/ide/ide-dma.c @@ -294,7 +294,7 @@ int ide_build_dmatable (ide_drive_t *drive, struct request *rq) } } - sg++; + sg = sg_next(sg); i--; } diff --git a/drivers/ide/ide-io.c b/drivers/ide/ide-io.c index c5b5011..2465c24 100644 --- a/drivers/ide/ide-io.c +++ b/drivers/ide/ide-io.c @@ -836,7 +836,8 @@ void ide_init_sg_cmd(ide_drive_t *drive, struct request *rq) ide_hwif_t *hwif = drive->hwif; hwif->nsect = hwif->nleft = rq->nr_sectors; - hwif->cursg = hwif->cursg_ofs = 0; + hwif->cursg_ofs = 0; + hwif->cursg = NULL; } EXPORT_SYMBOL_GPL(ide_init_sg_cmd); diff --git a/drivers/ide/ide-probe.c b/drivers/ide/ide-probe.c index cc58013..111ec02 100644 --- a/drivers/ide/ide-probe.c +++ b/drivers/ide/ide-probe.c @@ -1352,7 +1352,7 @@ static int hwif_init(ide_hwif_t *hwif) if (!hwif->sg_max_nents) hwif->sg_max_nents = PRD_ENTRIES; - hwif->sg_table = kmalloc(sizeof(struct scatterlist)*hwif->sg_max_nents, + hwif->sg_table = kzalloc(sizeof(struct scatterlist)*hwif->sg_max_nents, GFP_KERNEL); if (!hwif->sg_table) { printk(KERN_ERR "%s: unable to allocate SG table.\n", hwif->name); diff --git a/drivers/ide/ide-taskfile.c b/drivers/ide/ide-taskfile.c index aa06daf..3c92790 100644 --- a/drivers/ide/ide-taskfile.c +++ b/drivers/ide/ide-taskfile.c @@ -263,6 +263,7 @@ static void ide_pio_sector(ide_drive_t *drive, unsigned int write) { ide_hwif_t *hwif = drive->hwif; struct scatterlist *sg = hwif->sg_table; + struct scatterlist *cursg = hwif->cursg; struct page *page; #ifdef CONFIG_HIGHMEM unsigned long flags; @@ -270,8 +271,14 @@ static void ide_pio_sector(ide_drive_t *drive, unsigned int write) unsigned int offset; u8 *buf; - page = sg[hwif->cursg].page; - offset = sg[hwif->cursg].offset + hwif->cursg_ofs * SECTOR_SIZE; + cursg = hwif->cursg; + if (!cursg) { + cursg = sg; + hwif->cursg = sg; + } + + page = cursg->page; + offset = cursg->offset + hwif->cursg_ofs * SECTOR_SIZE; /* get the current page and offset */ page = nth_page(page, (offset >> PAGE_SHIFT)); @@ -285,8 +292,8 @@ static void ide_pio_sector(ide_drive_t *drive, unsigned int write) hwif->nleft--; hwif->cursg_ofs++; - if ((hwif->cursg_ofs * SECTOR_SIZE) == sg[hwif->cursg].length) { - hwif->cursg++; + if ((hwif->cursg_ofs * SECTOR_SIZE) == cursg->length) { + hwif->cursg = sg_next(hwif->cursg); hwif->cursg_ofs = 0; } @@ -367,6 +374,8 @@ static ide_startstop_t task_error(ide_drive_t *drive, struct request *rq, static void task_end_request(ide_drive_t *drive, struct request *rq, u8 stat) { + HWIF(drive)->cursg = NULL; + if (rq->cmd_type == REQ_TYPE_ATA_TASKFILE) { ide_task_t *task = rq->special; diff --git a/drivers/ide/mips/au1xxx-ide.c b/drivers/ide/mips/au1xxx-ide.c index 2e7013a..48cfb62 100644 --- a/drivers/ide/mips/au1xxx-ide.c +++ b/drivers/ide/mips/au1xxx-ide.c @@ -324,7 +324,7 @@ static int auide_build_dmatable(ide_drive_t *drive) cur_addr += tc; cur_len -= tc; } - sg++; + sg = sg_next(sg); i--; } diff --git a/drivers/ide/pci/sgiioc4.c b/drivers/ide/pci/sgiioc4.c index d396b29..9e36b29 100644 --- a/drivers/ide/pci/sgiioc4.c +++
[PATCH 33/33] IDE: sg chaining support
Cc: [EMAIL PROTECTED] Signed-off-by: Jens Axboe [EMAIL PROTECTED] --- drivers/ide/cris/ide-cris.c |3 ++- drivers/ide/ide-dma.c |2 +- drivers/ide/ide-io.c |3 ++- drivers/ide/ide-probe.c |2 +- drivers/ide/ide-taskfile.c| 17 + drivers/ide/mips/au1xxx-ide.c |2 +- drivers/ide/pci/sgiioc4.c |2 +- drivers/ide/ppc/pmac.c|2 +- include/linux/ide.h |2 +- 9 files changed, 23 insertions(+), 12 deletions(-) diff --git a/drivers/ide/cris/ide-cris.c b/drivers/ide/cris/ide-cris.c index 886091b..e1b2d01 100644 --- a/drivers/ide/cris/ide-cris.c +++ b/drivers/ide/cris/ide-cris.c @@ -951,7 +951,8 @@ static int cris_ide_build_dmatable (ide_drive_t *drive) /* group sequential buffers into one large buffer */ addr = page_to_phys(sg-page) + sg-offset; size = sg_dma_len(sg); - while (sg++, --i) { + while (--i) { + sg = sg_next(sg); if ((addr + size) != page_to_phys(sg-page) + sg-offset) break; size += sg_dma_len(sg); diff --git a/drivers/ide/ide-dma.c b/drivers/ide/ide-dma.c index 5fe1d72..a9a18a1 100644 --- a/drivers/ide/ide-dma.c +++ b/drivers/ide/ide-dma.c @@ -294,7 +294,7 @@ int ide_build_dmatable (ide_drive_t *drive, struct request *rq) } } - sg++; + sg = sg_next(sg); i--; } diff --git a/drivers/ide/ide-io.c b/drivers/ide/ide-io.c index c5b5011..2465c24 100644 --- a/drivers/ide/ide-io.c +++ b/drivers/ide/ide-io.c @@ -836,7 +836,8 @@ void ide_init_sg_cmd(ide_drive_t *drive, struct request *rq) ide_hwif_t *hwif = drive-hwif; hwif-nsect = hwif-nleft = rq-nr_sectors; - hwif-cursg = hwif-cursg_ofs = 0; + hwif-cursg_ofs = 0; + hwif-cursg = NULL; } EXPORT_SYMBOL_GPL(ide_init_sg_cmd); diff --git a/drivers/ide/ide-probe.c b/drivers/ide/ide-probe.c index cc58013..111ec02 100644 --- a/drivers/ide/ide-probe.c +++ b/drivers/ide/ide-probe.c @@ -1352,7 +1352,7 @@ static int hwif_init(ide_hwif_t *hwif) if (!hwif-sg_max_nents) hwif-sg_max_nents = PRD_ENTRIES; - hwif-sg_table = kmalloc(sizeof(struct scatterlist)*hwif-sg_max_nents, + hwif-sg_table = kzalloc(sizeof(struct scatterlist)*hwif-sg_max_nents, GFP_KERNEL); if (!hwif-sg_table) { printk(KERN_ERR %s: unable to allocate SG table.\n, hwif-name); diff --git a/drivers/ide/ide-taskfile.c b/drivers/ide/ide-taskfile.c index aa06daf..3c92790 100644 --- a/drivers/ide/ide-taskfile.c +++ b/drivers/ide/ide-taskfile.c @@ -263,6 +263,7 @@ static void ide_pio_sector(ide_drive_t *drive, unsigned int write) { ide_hwif_t *hwif = drive-hwif; struct scatterlist *sg = hwif-sg_table; + struct scatterlist *cursg = hwif-cursg; struct page *page; #ifdef CONFIG_HIGHMEM unsigned long flags; @@ -270,8 +271,14 @@ static void ide_pio_sector(ide_drive_t *drive, unsigned int write) unsigned int offset; u8 *buf; - page = sg[hwif-cursg].page; - offset = sg[hwif-cursg].offset + hwif-cursg_ofs * SECTOR_SIZE; + cursg = hwif-cursg; + if (!cursg) { + cursg = sg; + hwif-cursg = sg; + } + + page = cursg-page; + offset = cursg-offset + hwif-cursg_ofs * SECTOR_SIZE; /* get the current page and offset */ page = nth_page(page, (offset PAGE_SHIFT)); @@ -285,8 +292,8 @@ static void ide_pio_sector(ide_drive_t *drive, unsigned int write) hwif-nleft--; hwif-cursg_ofs++; - if ((hwif-cursg_ofs * SECTOR_SIZE) == sg[hwif-cursg].length) { - hwif-cursg++; + if ((hwif-cursg_ofs * SECTOR_SIZE) == cursg-length) { + hwif-cursg = sg_next(hwif-cursg); hwif-cursg_ofs = 0; } @@ -367,6 +374,8 @@ static ide_startstop_t task_error(ide_drive_t *drive, struct request *rq, static void task_end_request(ide_drive_t *drive, struct request *rq, u8 stat) { + HWIF(drive)-cursg = NULL; + if (rq-cmd_type == REQ_TYPE_ATA_TASKFILE) { ide_task_t *task = rq-special; diff --git a/drivers/ide/mips/au1xxx-ide.c b/drivers/ide/mips/au1xxx-ide.c index 2e7013a..48cfb62 100644 --- a/drivers/ide/mips/au1xxx-ide.c +++ b/drivers/ide/mips/au1xxx-ide.c @@ -324,7 +324,7 @@ static int auide_build_dmatable(ide_drive_t *drive) cur_addr += tc; cur_len -= tc; } - sg++; + sg = sg_next(sg); i--; } diff --git a/drivers/ide/pci/sgiioc4.c b/drivers/ide/pci/sgiioc4.c index d396b29..9e36b29 100644 --- a/drivers/ide/pci/sgiioc4.c +++ b/drivers/ide/pci/sgiioc4.c @@ -531,7 +531,7 @@