lkml.org 
[lkml]   [2003]   [Jun]   [24]   [last100]   RSS Feed
Views: [more markup]  [less markup]  [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
DateTue, 24 Jun 2003 15:44:36 +0200 (MET DST)
FromBartlomiej Zolnierkiewicz <>
SubjectRe: Testing IDE-TCQ and Taskfile - doesn't work nicely:)
Corrected patch below...
--
Bartlomiej

[ide] TCQ initialization fixes

- do not enable TCQ in ide_init_drive(), its too early
- enable TCQ in __ide_dma_on() only if CONFIG_BLK_DEV_IDE_TCQ_DEFAULT=y
- try to enable TCQ only on disk drives
- correct check for two drives on one channel

 drivers/ide/ide-dma.c   |    8 ++++----
 drivers/ide/ide-probe.c |    5 -----
 drivers/ide/ide-tcq.c   |   14 +++++++++++---
 include/linux/ide.h     |    1 -
 4 files changed, 15 insertions(+), 13 deletions(-)
diff -puN drivers/ide/ide-probe.c~ide-tcq-init-fixes drivers/ide/ide-probe.c
--- linux-2.5.73/drivers/ide/ide-probe.c~ide-tcq-init-fixes	Tue Jun 24 14:56:57 2003
+++ linux-2.5.73-root/drivers/ide/ide-probe.c	Tue Jun 24 14:56:57 2003
@@ -983,7 +983,6 @@ static void ide_init_queue(ide_drive_t *

 	blk_init_queue(q, do_ide_request, &ide_lock);
 	q->queuedata = HWGROUP(drive);
-	drive->queue_setup = 1;
 	blk_queue_segment_boundary(q, 0xffff);

 	if (!hwif->rqsize)
@@ -1005,10 +1004,6 @@ static void ide_init_queue(ide_drive_t *
 static void ide_init_drive(ide_drive_t *drive)
 {
 	ide_toggle_bounce(drive, 1);
-
-#ifdef CONFIG_BLK_DEV_IDE_TCQ_DEFAULT
-	HWIF(drive)->ide_dma_queued_on(drive);
-#endif
 }

 /*
diff -puN drivers/ide/ide-dma.c~ide-tcq-init-fixes drivers/ide/ide-dma.c
--- linux-2.5.73/drivers/ide/ide-dma.c~ide-tcq-init-fixes	Tue Jun 24 14:56:57 2003
+++ linux-2.5.73-root/drivers/ide/ide-dma.c	Tue Jun 24 15:16:34 2003
@@ -523,8 +523,7 @@ int __ide_dma_off_quietly (ide_drive_t *
 	if (HWIF(drive)->ide_dma_host_off(drive))
 		return 1;

-	if (drive->queue_setup)
-		HWIF(drive)->ide_dma_queued_off(drive);
+	HWIF(drive)->ide_dma_queued_off(drive);

 	return 0;
 }
@@ -585,8 +584,9 @@ int __ide_dma_on (ide_drive_t *drive)
 	if (HWIF(drive)->ide_dma_host_on(drive))
 		return 1;

-	if (drive->queue_setup)
-		HWIF(drive)->ide_dma_queued_on(drive);
+#ifdef CONFIG_BLK_DEV_IDE_TCQ_DEFAULT
+	HWIF(drive)->ide_dma_queued_on(drive);
+#endif

 	return 0;
 }
diff -puN drivers/ide/ide-tcq.c~ide-tcq-init-fixes drivers/ide/ide-tcq.c
--- linux-2.5.73/drivers/ide/ide-tcq.c~ide-tcq-init-fixes	Tue Jun 24 14:57:10 2003
+++ linux-2.5.73-root/drivers/ide/ide-tcq.c	Tue Jun 24 15:40:26 2003
@@ -501,8 +501,10 @@ static int ide_tcq_configure(ide_drive_t
 	 * bit 14 and 1 must be set in word 83 of the device id to indicate
 	 * support for dma queued protocol, and bit 15 must be cleared
 	 */
-	if ((drive->id->command_set_2 & tcq_bits) ^ tcq_mask)
+	if ((drive->id->command_set_2 & tcq_bits) ^ tcq_mask) {
+		printk(KERN_INFO "%s: TCQ not supported\n", drive->name);
 		return -EIO;
+	}

 	args = kmalloc(sizeof(*args), GFP_ATOMIC);
 	if (!args)
@@ -655,16 +657,20 @@ static int ide_tcq_check_blacklist(ide_d

 int __ide_dma_queued_on(ide_drive_t *drive)
 {
+	ide_hwif_t *hwif = HWIF(drive);
+
+	if (drive->media != ide_disk)
+		return 1;
 	if (!drive->using_dma)
 		return 1;
-	if (HWIF(drive)->chipset == ide_pdc4030)
+	if (hwif->chipset == ide_pdc4030)
 		return 1;
 	if (ide_tcq_check_blacklist(drive)) {
 		printk(KERN_WARNING "%s: tcq forbidden by blacklist\n",
 					drive->name);
 		return 1;
 	}
-	if (drive->next != drive) {
+	if (hwif->drives[0].present && hwif->drives[1].present) {
 		printk(KERN_WARNING "%s: only one drive on a channel supported"
 					" for tcq\n", drive->name);
 		return 1;
@@ -681,6 +687,8 @@ int __ide_dma_queued_on(ide_drive_t *dri

 int __ide_dma_queued_off(ide_drive_t *drive)
 {
+	if (drive->media != ide_disk)
+		return 1;
 	if (ata_pending_commands(drive)) {
 		printk("ide-tcq; can't toggle tcq feature on busy drive\n");
 		return 1;
diff -puN include/linux/ide.h~ide-tcq-init-fixes include/linux/ide.h
--- linux-2.5.73/include/linux/ide.h~ide-tcq-init-fixes	Tue Jun 24 14:56:57 2003
+++ linux-2.5.73-root/include/linux/ide.h	Tue Jun 24 14:56:57 2003
@@ -726,7 +726,6 @@ typedef struct ide_drive_s {
 	unsigned ata_flash	: 1;	/* 1=present, 0=default */
 	unsigned blocked        : 1;	/* 1=powermanagment told us not to do anything, so sleep nicely */
 	unsigned vdma		: 1;	/* 1=doing PIO over DMA 0=doing normal DMA */
-	unsigned queue_setup	: 1;
 	unsigned addressing;		/*      : 3;
 					 *  0=28-bit
 					 *  1=48-bit
_

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

\
 
 \ /
  Last update: 2005-03-22 12:36    [from the cache]
©2003-2008