Skip to contentSkip to conversation

ide-2.6 update

PATCH In review Bartlomiej Zolnierkiewicz 2 participants 3 messages Oct 22, 2004

Subsystems (3)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 ide-2.6 update

More syncing with -mm.

Please do a

	bk pull bk://bart.bkbits.net/ide-2.6

This will update the following files:

 arch/cris/arch-v10/drivers/ide.c |   10 -
 drivers/ide/arm/icside.c         |   38 +----
 drivers/ide/ide-cd.c             |    5 
 drivers/ide/ide-disk.c           |    2 
 drivers/ide/ide-dma.c            |   87 ++-----------
 drivers/ide/ide-io.c             |   12 +
 drivers/ide/ide-proc.c           |  257 ---------------------------------------
 drivers/ide/ide.c                |    1 
 drivers/ide/pci/sgiioc4.c        |   17 --
 drivers/ide/pci/siimage.c        |    7 -
 drivers/ide/ppc/pmac.c           |   58 --------
 drivers/scsi/ide-scsi.c          |  141 +++++++--------------
 include/linux/ide.h              |    6 
 13 files changed, 95 insertions(+), 546 deletions(-)

through these ChangeSets:

<bzolnier@trik.(none)> (04/10/22 1.2055)
[ide] kill /proc/ide/ide?/config

* writes to PCI config space are non-functional since 2.4.21
* reads of full PCI config space are allowed for normal users
* I'm not aware of any applications using this interface

<bzolnier@trik.(none)> (04/10/22 1.2054)
[ide] kill ide_hwif_t->ide_dma_verbose

* make __ide_dma_verbose() void and drop "__" prefix
* ide_dma_verbose() is always available now
* use it instead of ide_hwif_t->ide_dma_verbose
* sgiioc4.c version reported wrong mode
* icside.c version repeated info given by ->ide_dma_check()

<bzolnier@trik.(none)> (04/10/22 1.2053)
[ide] ide-scsi: simplify+speedup DMA support

* add hwif->sg_mapped flag
* add idescsi_map_sg() converting scsi_cmd->sg into

     hwif->sg_table (this removes need for rq->bio)

* remove code (de)allocating rq->bio

<bzolnier@trik.(none)> (04/10/22 1.2052)
[ide] kill ide_raw_build_sglist()

ide_build_sglist() can be now used for REQ_DRIVE_TASKFILE requests.

<bzolnier@trik.(none)> (04/10/22 1.2051)
[ide] use ide_map_sg()

* make Etrax ide.c, icside.c and ide-dma.c use ide_map_sg()
* use one sg for REQ_DRIVE_TASKFILE requests in ide-dma.c (no reason for 128 sectors per sg limit)

<bzolnier@trik.(none)> (04/10/22 1.2050)
[ide] pmac: kill pmac_ide_[raw_]build_sglist()

Just use ide_dma_[raw_]build_sglist() from ide-dma.c.

arch/cris/arch-v10/drivers/ide.c +2 -8
diff -Nru a/arch/cris/arch-v10/drivers/ide.c b/arch/cris/arch-v10/drivers/ide.c
@@ -656,15 +656,9 @@
 
 	ata_tot_size = 0;
 
-	if (HWGROUP(drive)->rq->flags & REQ_DRIVE_TASKFILE) {
-		sg_init_one(&sg[0], rq->buffer, rq->nr_sectors * SECTOR_SIZE);
-		hwif->sg_nents = i = 1;
-	}
-	else
-	{
-		hwif->sg_nents = i = blk_rq_map_sg(drive->queue, rq, hwif->sg_table);
-	}
+	ide_map_sg(drive, rq);
 
+	i = hwif->sg_nents;
 
 	while(i) {
 		/*
drivers/ide/arm/icside.c +7 -31
diff -Nru a/drivers/ide/arm/icside.c b/drivers/ide/arm/icside.c
@@ -212,33 +212,18 @@
 	ide_hwif_t *hwif = drive->hwif;
 	struct icside_state *state = hwif->hwif_data;
 	struct scatterlist *sg = hwif->sg_table;
-	int nents;
 
-	if (rq->flags & REQ_DRIVE_TASKFILE) {
-		ide_task_t *args = rq->special;
+	ide_map_sg(drive, rq);
 
-		if (args->command_type == IDE_DRIVE_TASK_RAW_WRITE)
-			hwif->sg_dma_direction = DMA_TO_DEVICE;
-		else
-			hwif->sg_dma_direction = DMA_FROM_DEVICE;
-
-		sg_init_one(sg, rq->buffer, rq->nr_sectors * SECTOR_SIZE);
-		nents = 1;
-	} else {
-		nents = blk_rq_map_sg(drive->queue, rq, sg);
-
-		if (rq_data_dir(rq) == READ)
-			hwif->sg_dma_direction = DMA_FROM_DEVICE;
-		else
-			hwif->sg_dma_direction = DMA_TO_DEVICE;
-	}
-
-	nents = dma_map_sg(state->dev, sg, nents, hwif->sg_dma_direction);
+	if (rq_data_dir(rq) == READ)
+		hwif->sg_dma_direction = DMA_FROM_DEVICE;
+	else
+		hwif->sg_dma_direction = DMA_TO_DEVICE;
 
-	hwif->sg_nents = nents;
+	hwif->sg_nents = dma_map_sg(state->dev, sg, hwif->sg_nents,
+				    hwif->sg_dma_direction);
 }
 
-
 /*
  * Configure the IOMD to give the appropriate timings for the transfer
  * mode being requested.  We take the advice of the ATA standards, and
@@ -498,14 +483,6 @@
 			ICS_ARCIN_V6_INTRSTAT_1)) & 1;
 }
 
-static int icside_dma_verbose(ide_drive_t *drive)
-{
-	printk(", %s (peak %dMB/s)",
-		ide_xfer_verbose(drive->current_speed),
-		2000 / drive->drive_data);
-	return 1;
-}
-
 static int icside_dma_timeout(ide_drive_t *drive)
 {
 	printk(KERN_ERR "%s: DMA timeout occurred: ", drive->name);
@@ -554,7 +531,6 @@
 	hwif->dma_start		= icside_dma_start;
 	hwif->ide_dma_end	= icside_dma_end;
 	hwif->ide_dma_test_irq	= icside_dma_test_irq;
-	hwif->ide_dma_verbose	= icside_dma_verbose;
 	hwif->ide_dma_timeout	= icside_dma_timeout;
 	hwif->ide_dma_lostirq	= icside_dma_lostirq;
 
drivers/ide/ide-cd.c +2 -3
diff -Nru a/drivers/ide/ide-cd.c b/drivers/ide/ide-cd.c
@@ -3039,10 +3039,9 @@
 
 	printk(", %dkB Cache", be16_to_cpu(cap.buffer_size));
 
-#ifdef CONFIG_BLK_DEV_IDEDMA
 	if (drive->using_dma)
-		(void) HWIF(drive)->ide_dma_verbose(drive);
-#endif /* CONFIG_BLK_DEV_IDEDMA */
+		ide_dma_verbose(drive);
+
 	printk("\n");
 
 	return nslots;
drivers/ide/ide-disk.c +1 -1
diff -Nru a/drivers/ide/ide-disk.c b/drivers/ide/ide-disk.c
@@ -1244,7 +1244,7 @@
 	printk(", CHS=%d/%d/%d", 
 	       drive->bios_cyl, drive->bios_head, drive->bios_sect);
 	if (drive->using_dma)
-		(void) HWIF(drive)->ide_dma_verbose(drive);
+		ide_dma_verbose(drive);
 	printk("\n");
 
 	drive->mult_count = 0;
drivers/ide/ide-dma.c +19 -68

140 lines not on this page · raw message

drivers/ide/ide-io.c +9 -3
diff -Nru a/drivers/ide/ide-io.c b/drivers/ide/ide-io.c
@@ -680,6 +680,9 @@
 	ide_hwif_t *hwif = drive->hwif;
 	struct scatterlist *sg = hwif->sg_table;
 
+	if (hwif->sg_mapped)	/* needed by ide-scsi */
+		return;
+
 	if ((rq->flags & REQ_DRIVE_TASKFILE) == 0) {
 		hwif->sg_nents = blk_rq_map_sg(drive->queue, rq, sg);
 	} else {
@@ -1219,12 +1222,15 @@
 	HWGROUP(drive)->rq = NULL;
 
 	rq->errors = 0;
+
+	if (!rq->bio)
+		goto out;
+
 	rq->sector = rq->bio->bi_sector;
 	rq->current_nr_sectors = bio_iovec(rq->bio)->bv_len >> 9;
 	rq->hard_cur_sectors = rq->current_nr_sectors;
-	if (rq->bio)
-		rq->buffer = NULL;
-
+	rq->buffer = NULL;
+out:
 	return ret;
 }
 
drivers/ide/ide-proc.c +0 -187

202 lines not on this page · raw message

%02x reg 0x%x value 0x%x\n",
- msg, dev->bus->number, dev->devfn, reg, val);
- printk("proc_ide_write_config: error %d\n", rc);
- err = -EIO;
- goto out1;
- }
-#endif /* CONFIG_BLK_DEV_IDEPCI */
- } else { /* not pci */
- switch (r->size) {
- case 1: hwif->OUTB(val, reg);
- break;
- case 2: hwif->OUTW(val, reg);
- break;
- case 4: hwif->OUTL(val, reg);
- break;
- }
- }
- }
- spin_unlock_irqrestore(&ide_lock, flags);
- err = count;
-out1:
- free_page((unsigned long)prog);
-out:
- free_page((unsigned long)buf);
- return err;
-
-parse_error:
- printk("parse error\n");
- printk("proc_ide: error: %s: '%s'\n", msg, start);
- err = -EINVAL;
- goto out1;
-}
-
-static int proc_ide_read_config
- (char *page, char **start, off_t off, int count, int *eof, void *data)
-{
- char *out = page;
- int len;
-
-#ifdef CONFIG_BLK_DEV_IDEPCI
- ide_hwif_t *hwif = (ide_hwif_t *)data;
- struct pci_dev *dev = hwif->pci_dev;
- if ((hwif->pci_dev && hwif->pci_dev->vendor) && dev && dev->bus) {
- int reg = 0;
-
- out += sprintf(out, "pci bus %02x device %02x vendor %04x "
- "device %04x channel %d\n",
- dev->bus->number, dev->devfn,
- hwif->pci_dev->vendor, hwif->pci_dev->device,
- hwif->channel);
- do {
- u8 val;
- int rc = pci_read_config_byte(dev, reg, &val);
- if (rc) {
- printk("proc_ide_read_config: error %d reading"
- " bus %02x dev %02x reg 0x%02x\n",
- rc, dev->bus->number, dev->devfn, reg);
- out += sprintf(out, "??%c",
- (++reg & 0xf) ? ' ' : '\n');
- } else
- out += sprintf(out, "%02x%c",
- val, (++reg & 0xf) ? ' ' : '\n');
- } while (reg < 0x100);
- } else
-#endif /* CONFIG_BLK_DEV_IDEPCI */
- out += sprintf(out, "(none)\n");
- len = out - page;
- PROC_IDE_READ_RETURN(page,start,off,count,eof,len);
-}
-
static int proc_ide_read_imodel
(char *page, char **start, off_t off, int count, int *eof, void *data)
{
@@ -687,7 +431,6 @@

static ide_proc_entry_t hwif_entries[] = {
{ "channel", S_IFREG|S_IRUGO, proc_ide_read_channel, NULL },
- { "config", S_IFREG|S_IRUGO|S_IWUSR,proc_ide_read_config, proc_ide_write_config
},
{ "mate", S_IFREG|S_IRUGO, proc_ide_read_mate, NULL },
{ "model", S_IFREG|S_IRUGO, proc_ide_read_imodel, NULL },
{ NULL, 0, NULL, NULL }

drivers/ide/ide.c +0 -1
diff -Nru a/drivers/ide/ide.c b/drivers/ide/ide.c
@@ -694,7 +694,6 @@
 	hwif->ide_dma_test_irq		= tmp_hwif->ide_dma_test_irq;
 	hwif->ide_dma_host_on		= tmp_hwif->ide_dma_host_on;
 	hwif->ide_dma_host_off		= tmp_hwif->ide_dma_host_off;
-	hwif->ide_dma_verbose		= tmp_hwif->ide_dma_verbose;
 	hwif->ide_dma_lostirq		= tmp_hwif->ide_dma_lostirq;
 	hwif->ide_dma_timeout		= tmp_hwif->ide_dma_timeout;
 
drivers/ide/pci/sgiioc4.c +1 -16
diff -Nru a/drivers/ide/pci/sgiioc4.c b/drivers/ide/pci/sgiioc4.c
@@ -332,17 +332,6 @@
 }
 
 static int
-sgiioc4_ide_dma_verbose(ide_drive_t * drive)
-{
-	if (drive->using_dma == 1)
-		printk(", UDMA(16)");
-	else
-		printk(", PIO");
-
-	return 1;
-}
-
-static int
 sgiioc4_ide_dma_lostirq(ide_drive_t * drive)
 {
 	HWIF(drive)->resetproc(drive);
@@ -501,10 +490,7 @@
 	unsigned int count = 0, i = 1;
 	struct scatterlist *sg;
 
-	if (HWGROUP(drive)->rq->flags & REQ_DRIVE_TASKFILE)
-		hwif->sg_nents = i = ide_raw_build_sglist(drive, rq);
-	else
-		hwif->sg_nents = i = ide_build_sglist(drive, rq);
+	hwif->sg_nents = i = ide_build_sglist(drive, rq);
 
 	if (!i)
 		return 0;	/* sglist of length Zero */
@@ -623,7 +609,6 @@
 	hwif->ide_dma_test_irq = &sgiioc4_ide_dma_test_irq;
 	hwif->ide_dma_host_on = &sgiioc4_ide_dma_host_on;
 	hwif->ide_dma_host_off = &sgiioc4_ide_dma_host_off;
-	hwif->ide_dma_verbose = &sgiioc4_ide_dma_verbose;
 	hwif->ide_dma_lostirq = &sgiioc4_ide_dma_lostirq;
 	hwif->ide_dma_timeout = &__ide_dma_timeout;
 	hwif->INB = &sgiioc4_INB;
drivers/ide/pci/siimage.c +0 -7
diff -Nru a/drivers/ide/pci/siimage.c b/drivers/ide/pci/siimage.c
@@ -554,12 +554,6 @@
 	return 0;
 }
 
-static int siimage_mmio_ide_dma_verbose (ide_drive_t *drive)
-{
-	int temp = __ide_dma_verbose(drive);
-	return temp;
-}
-
 /**
  *	siimage_busproc		-	bus isolation ioctl
  *	@drive: drive to isolate/restore
@@ -1077,7 +1071,6 @@
 
 	if (hwif->mmio) {
 		hwif->ide_dma_test_irq = &siimage_mmio_ide_dma_test_irq;
-		hwif->ide_dma_verbose = &siimage_mmio_ide_dma_verbose;
 	} else {
 		hwif->ide_dma_test_irq = & siimage_io_ide_dma_test_irq;
 	}
drivers/ide/ppc/pmac.c +2 -56

76 lines not on this page · raw message

drivers/scsi/ide-scsi.c +45 -13

89 lines not on this page · raw message

transfer the entire buffer at once */

feature.all = 0;
- if (drive->using_dma && rq->bio)
+ if (drive->using_dma && !idescsi_map_sg(drive, pc)) {
+ hwif->sg_mapped = 1;
feature.b.dma = !hwif->dma_setup(drive);
+ hwif->sg_mapped = 0;
+ }

SELECT_DRIVE(drive);
if (IDE_CONTROL_REG)
@@ -775,81 +810,6 @@
return -EINVAL;
}

-static inline struct bio *idescsi_kmalloc_bio (int count)
-{
- struct bio *bh, *bhp, *first_bh;
-
- if ((first_bh = bhp = bh = bio_alloc(GFP_ATOMIC, 1)) == NULL)
- goto abort;
- bio_init(bh);
- bh->bi_vcnt = 1;
- while (--count) {
- if ((bh = bio_alloc(GFP_ATOMIC, 1)) == NULL)
- goto abort;
- bio_init(bh);
- bh->bi_vcnt = 1;
- bhp->bi_next = bh;
- bhp = bh;
- bh->bi_next = NULL;
- }
- return first_bh;
-abort:
- idescsi_free_bio (first_bh);
- return NULL;
-}
-
-static inline int idescsi_set_direction (idescsi_pc_t *pc)
-{
- switch (pc->c[0]) {
- case READ_6: case READ_10: case READ_12:
- clear_bit (PC_WRITING, &pc->flags);
- return 0;
- case WRITE_6: case WRITE_10: case WRITE_12:
- set_bit (PC_WRITING, &pc->flags);
- return 0;
- default:
- return 1;
- }
-}
-
-static inline struct bio *idescsi_dma_bio(ide_drive_t *drive, idescsi_pc_t *pc) -{
- struct bio *bh = NULL, *first_bh = NULL;
- int segments = pc->scsi_cmd->use_sg;
- struct scatterlist *sg = pc->scsi_cmd->request_buffer;
-
- if (!drive->using_dma || !pc->request_transfer || pc->request_transfer % 1024)
- return NULL;
- if (idescsi_set_direction(pc))
- return NULL;
- if (segments) {
- if ((first_bh = bh = idescsi_kmalloc_bio (segments)) == NULL)
- return NULL;
-#if IDESCSI_DEBUG_LOG
- printk ("ide-scsi: %s: building DMA table, %d segments, %dkB
total\n", drive->name, segments, pc->request_transfer >> 10); -#endif /* IDESCSI_DEBUG_LOG */
- while (segments--) {
- bh->bi_io_vec[0].bv_page = sg->page;
- bh->bi_io_vec[0].bv_len = sg->length;
- bh->bi_io_vec[0].bv_offset = sg->offset;
- bh->bi_size = sg->length;
- bh = bh->bi_next;
- sg++;
- }
- } else {
- if ((first_bh = bh = idescsi_kmalloc_bio (1)) == NULL)
- return NULL;
-#if IDESCSI_DEBUG_LOG
- printk ("ide-scsi: %s: building DMA table for a single buffer
(%dkB)\n", drive->name, pc->request_transfer >> 10);
-#endif /* IDESCSI_DEBUG_LOG */
- bh->bi_io_vec[0].bv_page = virt_to_page(pc->scsi_cmd->request_buffer);
- bh->bi_io_vec[0].bv_offset = offset_in_page(pc->scsi_cmd->request_buffer);
- bh->bi_io_vec[0].bv_len = pc->request_transfer;
- bh->bi_size = pc->request_transfer;
- }
- return first_bh;
-}
-
static inline int should_transform(ide_drive_t *drive, struct scsi_cmnd *cmd) {
idescsi_scsi_t *scsi = drive_to_idescsi(drive);
@@ -921,7 +881,6 @@

ide_init_drive_cmd (rq);
rq->special = (char *) pc;
- rq->bio = idescsi_dma_bio (drive, pc);
rq->flags = REQ_SPECIAL; spin_unlock_irq(host->host_lock);
(void) ide_do_drive_cmd (drive, rq, ide_end);
@@ -975,7 +934,6 @@
*/
printk (KERN_ERR "ide-scsi: cmd aborted!\n");

- idescsi_free_bio(scsi->pc->rq->bio);
if (scsi->pc->rq->flags & REQ_SENSE)
kfree(scsi->pc->buffer);
kfree(scsi->pc->rq);
@@ -1024,7 +982,6 @@
/* kill current request */ blkdev_dequeue_request(req); end_that_request_last(req);
- idescsi_free_bio(req->bio);
if (req->flags & REQ_SENSE)
kfree(scsi->pc->buffer);
kfree(scsi->pc);

include/linux/ide.h +3 -3
diff -Nru a/include/linux/ide.h b/include/linux/ide.h
@@ -874,7 +874,6 @@
 	int (*ide_dma_test_irq)(ide_drive_t *drive);
 	int (*ide_dma_host_on)(ide_drive_t *drive);
 	int (*ide_dma_host_off)(ide_drive_t *drive);
-	int (*ide_dma_verbose)(ide_drive_t *drive);
 	int (*ide_dma_lostirq)(ide_drive_t *drive);
 	int (*ide_dma_timeout)(ide_drive_t *drive);
 
@@ -938,6 +937,7 @@
 	unsigned	no_lba48_dma : 1; /* 1 = cannot do LBA48 DMA */
 	unsigned	no_dsc     : 1;	/* 0 default, 1 dsc_overlap disabled */
 	unsigned	auto_poll  : 1; /* supports nop auto-poll */
+	unsigned	sg_mapped  : 1;	/* sg_table and sg_nents are ready */
 
 	struct device	gendev;
 	struct semaphore gendev_rel_sem; /* To deal with device release() */
@@ -1492,10 +1492,10 @@
 int __ide_dma_bad_drive(ide_drive_t *);
 int __ide_dma_good_drive(ide_drive_t *);
 int __ide_dma_off(ide_drive_t *);
+void ide_dma_verbose(ide_drive_t *);
 
 #ifdef CONFIG_BLK_DEV_IDEDMA_PCI
 extern int ide_build_sglist(ide_drive_t *, struct request *);
-extern int ide_raw_build_sglist(ide_drive_t *, struct request *);
 extern int ide_build_dmatable(ide_drive_t *, struct request *);
 extern void ide_destroy_dmatable(ide_drive_t *);
 extern ide_startstop_t ide_dma_intr(ide_drive_t *);
@@ -1511,13 +1511,13 @@
 extern void ide_dma_start(ide_drive_t *);
 extern int __ide_dma_end(ide_drive_t *);
 extern int __ide_dma_test_irq(ide_drive_t *);
-extern int __ide_dma_verbose(ide_drive_t *);
 extern int __ide_dma_lostirq(ide_drive_t *);
 extern int __ide_dma_timeout(ide_drive_t *);
 #endif /* CONFIG_BLK_DEV_IDEDMA_PCI */
 
 #else
 static inline int __ide_dma_off(ide_drive_t *drive) { return 0; }
+static inline void ide_dma_verbose(ide_drive_t *drive) { ; }
 #endif /* CONFIG_BLK_DEV_IDEDMA */
 
 #ifndef CONFIG_BLK_DEV_IDEDMA_PCI
#1 lore raw
Quoted 16 lines · Bartlomiej Zolnierkiewicz
drivers/ide/arm/icside.c +0 -8
@@ -498,14 +483,6 @@
 			ICS_ARCIN_V6_INTRSTAT_1)) & 1;
 }
 
-static int icside_dma_verbose(ide_drive_t *drive)
-{
-	printk(", %s (peak %dMB/s)",
-		ide_xfer_verbose(drive->current_speed),
-		2000 / drive->drive_data);
-	return 1;
-}
-
 static int icside_dma_timeout(ide_drive_t *drive)
 {
 	printk(KERN_ERR "%s: DMA timeout occurred: ", drive->name);

drivers/ide/arm/icside.c line 535

Quoted 6 lines
drivers/ide/arm/icside.c +0 -1
@@ -554,7 +531,6 @@
 	hwif->dma_start		= icside_dma_start;
 	hwif->ide_dma_end	= icside_dma_end;
 	hwif->ide_dma_test_irq	= icside_dma_test_irq;
-	hwif->ide_dma_verbose	= icside_dma_verbose;
 	hwif->ide_dma_timeout	= icside_dma_timeout;
 	hwif->ide_dma_lostirq	= icside_dma_lostirq;

Why are you denying me the ability to report detailed drive transfer speed information? Would you prefer me to printk a separate line and further clutter up the message log instead?

Signature · 4 lines
Russell King
 Linux kernel    2.6 ARM Linux   - http://www.arm.linux.org.uk/
 maintainer of:  2.6 PCMCIA      - http://pcmcia.arm.linux.org.uk/
                 2.6 Serial core
#2 lore raw
Quoted 28 lines · Russell King
Quoted 16 lines · Bartlomiej Zolnierkiewicz
drivers/ide/arm/icside.c +0 -8
@@ -498,14 +483,6 @@
                      ICS_ARCIN_V6_INTRSTAT_1)) & 1;
 }
 
-static int icside_dma_verbose(ide_drive_t *drive)
-{
-     printk(", %s (peak %dMB/s)",
-             ide_xfer_verbose(drive->current_speed),
-             2000 / drive->drive_data);
-     return 1;
-}
-
 static int icside_dma_timeout(ide_drive_t *drive)
 {
      printk(KERN_ERR "%s: DMA timeout occurred: ", drive->name);

drivers/ide/arm/icside.c line 535

Quoted 6 lines
drivers/ide/arm/icside.c +0 -1
@@ -554,7 +531,6 @@
      hwif->dma_start         = icside_dma_start;
      hwif->ide_dma_end       = icside_dma_end;
      hwif->ide_dma_test_irq  = icside_dma_test_irq;
-     hwif->ide_dma_verbose   = icside_dma_verbose;
      hwif->ide_dma_timeout   = icside_dma_timeout;
      hwif->ide_dma_lostirq   = icside_dma_lostirq;

Why are you denying me the ability to report detailed drive transfer speed information? Would you prefer me to printk a separate line and further clutter up the message log instead?

Quoted 2 lines

From the changelog:
* icside.c version repeated info given by ->ide_dma_check()

If DMA is going to be used:
* ->ide_dma_check is always called
* icside_dma_check() always calls icside_set_speed()
* icside_set_speed() always does

	printk("%s: %s selected (peak %dMB/s)\n", drive->name,
		ide_xfer_verbose(xfer_mode), 2000 / drive->drive_data);

so what am I missing?

Bartlomiej